【问题标题】:Entity Framework 6 multiple table to one foreign key relationship code firstEntity Framework 6 多表到一个外键关系代码优先
【发布时间】:2014-01-01 02:11:06
【问题描述】:

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

如果我将 Table_3 作为列表添加到我的实体中的 Table_1 和 Table_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 代码首先生成如下

编辑

只是为了让遇到同样问题的人知道

我现在已经通过将 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; }
}

用表格排列

这会起作用,但如果能满足原件会更好。

【问题讨论】:

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


    【解决方案1】:

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

    旁注,建议在 public List Children { get; 上添加 virtual 关键字放; } 在 parentbase 类中,因为在您之前的示例中,它已经是这样了。

    感谢您发布此信息,我也遇到了这个问题。

    【讨论】:

      【解决方案2】:

      您还可以执行以下操作,分别在 Table_1Table_2Table_3 之间建立一对多关系:

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

      如果需要进一步说明,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-29
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 2021-05-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多