如何通过OnModelCreating方法动态创建外键

时间:2017-02-02 14:42:53

标签: c# entity-framework

在我的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我想做的(如果可能的话)是:

  • 获取从Replaceable继承的所有实体。
  • 将列REPLACING标记为外键,并将其指向实体的主键(PART_ID,COM​​PONENT_ID等)。

这里的技巧是如何获取每个实体表的ID列的名称,因为它们都不是ID,而是PART_ID,COM​​PONENT_ID等。

这甚至可能吗?另一种做法也是受欢迎的。

1 个答案:

答案 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])
)