Entity framework 无密钥属性的复合PK
我首先在EF5项目的代码中使用手动映射实体,并希望使用FKs作为复合PK。我在映射类(不是FK)中只有导航属性,如下所述:Entity framework 无密钥属性的复合PK,entity-framework,entity-framework-5,composite-primary-key,Entity Framework,Entity Framework 5,Composite Primary Key,我首先在EF5项目的代码中使用手动映射实体,并希望使用FKs作为复合PK。我在映射类(不是FK)中只有导航属性,如下所述: class MyMapping { public virtual Mapped1 {get;set;} public virtual Mapped2 {get;set;} } 我不想添加像“int-Mapped1FK”/“int-Mapped2FK”这样的字段,但在这种情况下我找不到如何指定复合键 我认为应该是这样的: modelBuilder.Entity<
class MyMapping
{
public virtual Mapped1 {get;set;}
public virtual Mapped2 {get;set;}
}
我不想添加像“int-Mapped1FK”/“int-Mapped2FK”这样的字段,但在这种情况下我找不到如何指定复合键
我认为应该是这样的:
modelBuilder.Entity<MyMapping>()
.HasKey(k => k.Mapped1)
.HasKey(k => k.Mapped2);
modelBuilder.Entity()
.HasKey(k=>k.Mapped1)
.HasKey(k=>k.Mapped2);
或
modelBuilder.Entity()
.HasKey(k=>{k.Mapped1,k.Mapped2});
但我不知道什么是正确的。不可能将导航属性用作主键属性(无论是否为复合属性)。键属性必须具有基本类型-如
int
或string
或Guid
等。如Slauma所述,如果不引入基本FK属性,就不可能实现我想要的功能
所以我决定像处理普通POCO一样处理映射实体-使用
public int Id {get;set;}
声明并将其用作PK
另外,在其他来源中,由于架构的原因,建议使用以下方法:将简单映射(2个FKs)转换为复杂映射(2个FKs+自定义字段))它与项目中的任何其他实体一样成为普通实体,并且应该具有相同的约束和结构。我假设EF在我指定(例如)一对一关系时,仅使用导航属性透明地创建基本属性?这就是我所问的情况。@AlexG.P:是的,外键属性是这样,但主键属性不是这样。如果其中一个外键同时是主键(或主键的一部分),则必须在模型中将此FK作为基本体属性公开。您不能再单独使用导航属性。
public int Id {get;set;}