对于长标题的歉意,想不出一个更好的方法来总结这个问题。
我正在尝试使用EF6重写现有的L2S上下文,并且存在一个存在问题的可疑关系。
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中更改属性和设置不同关系的各种组合,现在我已经在这上面旋转了三天,再也看不见树木了。
答案 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 TPH和inheritance mapping strategies with entity framework code first