首页 文章

如何使用多个主键

提问于
浏览
8

我创建了数据库,对于我的Android应用程序,女巫有16个表 . 我想使用ORMlite映射 . 问题是我没有找到你有复合id(多个主键)的例子 . 例如我有 table :

CREATE  TABLE IF NOT EXISTS `Tourist_Guide`.`Cultural_activity` (
  `City_Id` INT NOT NULL ,
  `activity_Id` INT NOT NULL ,
  `Cultural_activity_Id` INT NOT NULL AUTO_INCREMENT ,
  `Name_Of_Cultural_activity` VARCHAR(30) NOT NULL ,
  PRIMARY KEY (`Cultural_activity_Id`, `City_Id`, `activity_Id`) ,
  INDEX `fk_Cultural_activity_activity1` (`City_Id` ASC, `activity_Id` ASC) ,
  CONSTRAINT `fk_Cultural_activity_activity1`
    FOREIGN KEY (`City_Id` , `activity_Id` )
    REFERENCES `Tourist_Guide`.`activity` (`City_Id` , `activity_Id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

请你告诉我如何将这个表映射到类(这个类应该如何),是否可能?

4 回答

  • 6

    限制为简单起见,并且能够在db4o,memcached,redis或文件系统(即ServiceStack中包含的提供程序)中保留相同的POCO类,每个模型必须具有单个主键,按照惯例,OrmLite期望它是Id虽然您使用[Alias(“DbFieldName”)]属性,但它将其映射到具有不同名称的列,或使用[PrimaryKey]属性告诉OrmLite使用不同的属性作为主键 . 您仍然可以从这些表中进行SELECT,您将无法使用依赖于它的API,例如更新或删除隐含过滤器(即未指定)的位置,以ById结尾的所有API等 . 解决方法单主键限制支持具有多个主键的表的潜在解决方法是创建自动生成的Id属性,该属性返回基于所有主键字段的唯一值,例如:

    public class OrderDetail
    {
        public string Id { get { return this.OrderId + "/" + this.ProductId; } }
    
    
    
    public int OrderId { get; set; }
        public int ProductId { get; set; }
        public decimal UnitPrice { get; set; }
        public short Quantity { get; set; }
        public double Discount { get; set; }
    }
    

    https://github.com/ServiceStack/ServiceStack.OrmLite/#limitations

  • 19

    您必须在每个唯一字段上方使用以下注释:

    @DatabaseField(uniqueCombo = true)

    Here are the docs on uniqueCombo.

  • 10

    可以生成由其他字段的组合组成的人工ID字段 . 这可以通过将 @DatabaseField 注释中的useSetGet属性设置为true来完成 . 这使得ORMLite调用getter和setter方法,而不是使用反射 .

    在你的getter中,你可以返回你的领域的组合 .

    在您的示例中,这看起来像这样:

    @DatabaseField(id=true, useGetSet=true)
    private String id;
    
    ...
    
    public String getId(){
    
        return culturalAcitivityId +"-" +cityId +"-" +activityId;
    
    }
    public void setId(String id){
    
        this.id = id;
    
    }
    

    http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/DatabaseField.html#useGetSet()

  • 0

    ServiceStack's OrmLite按设计不支持多个复合主键 . 为了使相同的POCO在数据库之外有用(例如NoSQL数据存储区,缓存提供程序等),OrmLite期望每个类型都有一个主键,我的默认值是 Id 属性(可以用ModelConfig类覆盖或 [PrimaryKey][Alias] 属性) .

    解决此限制的解决方法包括创建单个唯一ID但在复合主键上包含唯一约束,例如:

    [CompositeIndex("CompositePkId1","CompositePkId2", Unique = true)] 
    public class Poco 
    {
        [AutoIncrement]
        public int Id { get; set; }
        public int CompositePkId1 { get; set; }
        public int CompositePkId2 { get; set; }
    }
    

    或者创建包含所有主键组合的伪列,例如:

    public class Poco 
    {
        public string Id { get { return CompositePkId1 + ":" + CompositePkId2; } }
        public int CompositePkId1 { get; set; }
        public int CompositePkId2 { get; set; }
    }
    

相关问题