在我的EF6模型上,我创建了一些基类,这些基类包含我希望在多个实体之间继承的属性/列。
这是一个简单的概念示例:
public class Replaceable
{
[Column("REPLACING")]
public int Replacing { get; set; }
}
[Table("PARTS")]
public class Part : Replaceable
{
[Column("ID"), Key]
public int Id { get; set; }
[Column("PART_NUMBER")]
public string PartNumber { get; set; }
}
所以REPLACING属性&列将继承到Part-class / PARTS-table。
REPLACING列应该指向同一个表中的ID。例如,如果您更换了要跟踪替换内容的零件。
通过OnModelCreating
我想做的(如果可能的话)是:
这里的技巧是如何获取每个实体表的ID列的名称,因为它们都不是ID,而是PART_ID,COMPONENT_ID等。
这甚至可能吗?另一种做法也是受欢迎的。
答案 0 :(得分:1)
您可以使用基本配置类:
public abstract class ReplaceableConfiguration<T> : EntityTypeConfiguration<T>
where T : Replaceable
{
public ReplaceableConfiguration()
{
this.Property(r => r.Replacing).HasColumnName(typeof(T).Name + "_ID");
}
}
并根据需要派生出许多具体的课程。
public class PartConfiguration : ReplaceableConfiguration<Part>
{ }
public class ComponentConfiguration : ReplaceableConfiguration<Component>
{ }
我只用了两个类来尝试这个:
modelBuilder.Configurations.Add(new PartConfiguration());
modelBuilder.Configurations.Add(new ComponentConfiguration());
这给了我这个DDL:
CREATE TABLE [dbo].[PARTS] (
[ID] [int] NOT NULL IDENTITY,
[PART_NUMBER] [nvarchar](max),
[Part_ID] [int] NOT NULL,
CONSTRAINT [PK_dbo.PARTS] PRIMARY KEY ([ID])
)
CREATE TABLE [dbo].[COMPONENTS] (
[ID] [int] NOT NULL IDENTITY,
[COMPONENT_NUMBER] [nvarchar](max),
[Component_ID] [int] NOT NULL,
CONSTRAINT [PK_dbo.COMPONENTS] PRIMARY KEY ([ID])
)