无法定义相同的两个实体之间的两个关系

时间:2015-03-19 22:58:32

标签: c# entity-framework ef-code-first entity-relationship foreign-key-relationship

我无法让EF 6 Code First按照我想要的方式映射以下两种关系。

有两个实体:TemplateTemplateVersion

每个TemplateVersion只有一个ParentTemplate

Template有一个TemplateVersion的集合。

这是第一个,简单的,1:多关系,双方都有导航属性。

现在是第二个:

TemplateVersion相关联的所有Template中,只有一个(例如“最新”)是CurrentTemplateVersion的{​​{1}}。

所以:Template有一个导航属性Template和一个关联的属性CurrentVersionCurrentVersionId方没有相应的导航属性。

所以,我想说,第二个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:多(好)

enter image description here

第二关系,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是!

enter image description here

生成的数据库表完全镜像:Template.Id不是任何外键的一部分,CurrentVersionId表上的Id被错误地定义为{{1}的外键在Template表上。

我错过了什么?

PS。即使我完全删除第一个关系,第二个关系也是一样。

1 个答案:

答案 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);