我无法让EF 6 Code First按照我想要的方式映射以下两种关系。
有两个实体:Template
和TemplateVersion
。
每个TemplateVersion
只有一个ParentTemplate
。
Template
有一个TemplateVersion
的集合。
这是第一个,简单的,1:多关系,双方都有导航属性。
现在是第二个:
与TemplateVersion
相关联的所有Template
中,只有一个(例如“最新”)是CurrentTemplateVersion
的{{1}}。
所以:Template
有一个导航属性Template
和一个关联的属性CurrentVersion
。
CurrentVersionId
方没有相应的导航属性。
所以,我想说,第二个TemplateVersion
关系是Template : TemplateVersion
。
以下是模型:
0..1 : 1
我喜欢让我的模型类不受DB细节的影响,所以我在上下文中定义了关系:
public class Template
{
public int Id { get; set; }
[...]
public virtual int CurrentVersionId { get; set; }
public virtual TemplateVersion CurrentVersion { get; set; }
public virtual ICollection<TemplateVersion> Versions { get; set; }
}
public class TemplateVersion
{
public int Id { get; set; }
[...]
public virtual int ParentTemplateId { get; set; }
public virtual Template ParentTemplate { get; set; }
}
问题是,第二种关系不能按预期工作。
使用EF Power Tools插件,我对模型图进行了反向工程。这是我得到的:
第一关系,1:多(好)
第二关系,0..1:1
请注意, protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Template>()
.HasMany(template => template.Versions)
.WithRequired(version => version.ParentTemplate)
;
modelBuilder.Entity<Template>()
.HasRequired(template => template.CurrentVersion)
.WithOptional()
;
}
属性不是是关系的一部分,CurrentVersionId
是!
生成的数据库表完全镜像:Template.Id
不是任何外键的一部分,CurrentVersionId
表上的Id
被错误地定义为{{1}的外键在Template
表上。
我错过了什么?
PS。即使我完全删除第一个关系,第二个关系也是一样。
答案 0 :(得分:1)
在一对一关系中,EF要求从属端的PK也必须是关系的FK:
public class Foo
{
public int Id{get;set;}
//...
}
public class Boo
{
[Key,ForeignKey("Foo")]
public int FooId{get;set;}
public virtual Foo Foo{get;set;}
//...
}
如果您需要TemplateVersion
拥有自己的Id
,那么,要解决您的问题,您可以通过以下方式配置该关系:
modelBuilder.Entity<Template>()
.HasRequired(template => template.CurrentVersion)
.WithMany().HasForeignKey(t=>t.CurrentVersionId);