实体框架6首先将多个表与一个外键关系代码

时间:2013-12-13 10:33:40

标签: c# sql entity-framework ef-code-first

我想知道是否有人可以告诉我如何在EF6中首先使用代码完成以下代码

enter image description here

如果我将Table_3作为列表添加到Table_1&我的实体中的表_2。 EF会自动为Table_3中的两个表生成外键列,而不是识别它们属于同一类型。

我的模型类设置如下。

public interface IParent
{
    int ID { get; set; }
    List<Table_3> Children { get; set; }
}

public class Table_1 : IParent
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual List<Table_3> Children { get; set; }
}

public class Table_2 : IParent
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual List<Table_3> Children { get; set; }
}

public class Table_3
{
    [Key]
    public int ID { get; set; }
    public int ParentID { get; set; }
    [ForeignKey("ParentID")]
    public virtual IParent Parent { get; set; }
}

EF代码首先生成以下

enter image description here

修改

只是为了让任何有同样问题的人知道

我现在通过将IParent接口更改为抽象类来解决此问题 我的课程现在看起来像以下

[Table("ParentBase")]
public abstract class ParentBase
{
    [Key]
    public int ID { get; set; }
    public List<Table_3> Children { get; set; }
}
[Table("Table_1")]
public class Table_1 : ParentBase
{
    public string Name { get; set; }
}
[Table("Table_2")]
public class Table_2 : ParentBase
{
    public string Name { get; set; }
}
[Table("Table_3")]
public class Table_3
{
    [Key]
    public int ID { get; set; }
    public int ParentID { get; set; }
    [ForeignKey("ParentID")]
    public virtual ParentBase Parent { get; set; }
}

表格排列

enter image description here

如果能够满足原件的要求会更好。

2 个答案:

答案 0 :(得分:1)

您还可以执行以下操作:Table_1Table_2分别与Table_3建立1对多的关系:

modelBuilder.Entity<Table_3>().HasOptional(/*Nav Prop*/).WithMany(m => m.Table_3s).HasForeignKey(f => f.ParentId).WillCascadeOnDelete(false);
modelBuilder.Entity<Table_3>().HasOptional(/*Nav Prop*/).WithMany(m => m.Table_3s).HasForeignKey(f => f.ParentId).WillCascadeOnDelete(false);

如果需要澄清,请告诉我。

答案 1 :(得分:1)

我也有这个问题,我从一开始就使用抽象类而不是接口。 我的问题是我的table_3有两个导航属性: 一个是公共虚拟Table_1,另一个是公共虚拟Table_2,然后EF只是配置了这些额外的外键列, 我将两个导航属性合并为一个 public virtual parentbase {get;set;}.然后它奏效了。希望这会有所帮助。

旁注,建议在公共列表儿童上添加虚拟关键字{get;组;在parentbase类中,因为在前面的示例中,它已经是这样了。

感谢发布此内容,我也遇到了这个问题。