EF6多对多关系,将多个表联接到表

时间:2018-07-31 20:18:36

标签: c# entity-framework-6

对于长标题的歉意,想不出一个更好的方法来总结这个问题。

我正在尝试使用EF6重写现有的L2S上下文,并且存在一个存在问题的可疑关系。

diagram of table relationships

EntityAttributes充当许多表(包括材料和公式)到Attributes的联接表。

左侧的所有表都有一个ID标识列和一个EntityTypeId列作为复合PK。 EntityTypeId列的值对于每个表都是唯一的(材料为1,公式为2,依此类推)

“属性”表具有ID(身份)和EntityTypeId的复合PK。

EntityAttributes表的PK为Id(身份),并且AttributeId和EntityTypeId为FK,位于属性上。

尝试创建EntityAttribute时,出现以下异常:

  

ReferentialConstraint中的从属属性映射到商店生成的列。列:“ Id”。

我认为,根本问题是与EntityAttributes的材质,公式等关系在数据库级别上不可执行。 L2S似乎并不介意,但EF6似乎更符合底层数据存储的限制。

所以我的问题有两个: 1.是否有一种方法可以使EF与当前建立的这种关系一起使用? 2.如果没有,那么要达到相同结果的更好的设计是什么?我完全可以控制数据库架构。

材料类别:

public partial class Material
{
    [Key]
    [Column(Order = 0)]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int EntityTypeId { get; set; }
}

EntityAttribute类:

public partial class EntityAttribute
{
    [Key]
    [Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Key]
    [Column(Order = 1)]
    public int AttributeId { get; set; }

    [Key]
    [Column(Order = 2)]
    public int EntityId { get; set; }

    [Key]
    [Column(Order = 3)]
    public int EntityTypeId { get; set; }
}

属性类:

public partial class Attribute
{
    [Key]
    [Column(Order = 0)]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int EntityTypeId { get; set; }
}

OnModelCreating中的关系定义:

    modelBuilder.Entity<Attribute>()
      .HasMany(e => e.EntityAttributes)
      .WithRequired(e => e.Attribute)
      .HasForeignKey(e => new { e.AttributeId, e.EntityTypeId });

我已经尝试过在OnModelCreating中更改属性和设置不同关系的各种组合,现在我已经在这上面旋转了三天,再也看不见树木了。

1 个答案:

答案 0 :(得分:1)

您想要的是Table per Hierarchy,其中EntityAttribute的表将具有discriminator字段来确定您的实体是Material还是Formula

public class EntityAttribute
{
    public int Id { get; set; }
    public int AttributeId { get; set; }
    public int EntityId { get; set; }
    ...
}

public class Material : EntityAttribute
{
    public int Id { get; set; }
    ...
}

public class Formula : EntityAttribute
{
    public int Id { get; set; }
    ...
}

以下帮助链接:learn entity framework TPHinheritance mapping strategies with entity framework code first