Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过OnModelCreating方法动态创建外键_C#_Entity Framework - Fatal编程技术网

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

C# 如何通过OnModelCreating方法动态创建外键,c#,entity-framework,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

在我的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; }
}
因此,“替换属性”列将继承到零件类/零件表

替换列应该指向同一表中的ID。例如,如果您更换了一个零件,您希望跟踪更换的零件

如果可能的话,我想通过
OnModelCreating
做的是:

  • 获取从可替换对象继承的所有实体
  • 将列标记为外键,并将其指向实体的主键(PART_ID、COMPONENT_ID等)
这里的技巧是如何获取每个实体表的ID列的名称,因为它们都不是ID,而是PART_ID、COMPONENT_ID等


这可能吗?也欢迎另一种做法

您可以使用基本配置类:

public abstract class ReplaceableConfiguration<T> : EntityTypeConfiguration<T>
    where T : Replaceable
{
    public ReplaceableConfiguration()
    {
        this.Property(r => r.Replacing).HasColumnName(typeof(T).Name + "_ID");
    }
}
这给了我这个DDL:

创建表[dbo].[PARTS](
[ID][int]不是空标识,
[零件编号][nvarchar](最大值),
[Part_ID][int]不为空,
约束[PK_dbo.PARTS]主键([ID])
)
创建表[dbo]。[COMPONENTS](
[ID][int]不是空标识,
[部件编号][nvarchar](最大值),
[Component_ID][int]不为空,
约束[PK_dbo.COMPONENTS]主键([ID])
)

也许可以创建您自己的属性并将其添加到您想要使用的属性中,然后使用反射将其拉出?@DavidG:好的,这是一个选项。我已经做了类似的事情来设置十进制精度。您能否设置一个示例,在获取属性后,您可以拉出每个类的主键?
public class PartConfiguration : ReplaceableConfiguration<Part>
{ }

public class ComponentConfiguration : ReplaceableConfiguration<Component>
{ }
modelBuilder.Configurations.Add(new PartConfiguration());
modelBuilder.Configurations.Add(new ComponentConfiguration());