EF Core数据访问层中的覆盖类

时间:2018-08-15 13:06:02

标签: c# .net-core entity-framework-core

我的公司拥有一个在所有客户之间共享的核心数据库架构,然后我们为每个客户提供了特定于客户的架构。核心数据库本身永远不会改变。我们正在为核心数据访问项目制作一个NuGet软件包,然后让我们的客户特定项目从该项目扩展而来。

我已设置一切都可以从核心项目继承,并且可以正常工作。我现在的问题是,我们需要向一个核心类中添加一个导航属性。该表完全相同,但是我们在此核心表中添加了带有FK的特定于客户的表,因此需要一个导航属性。是否有可能做到这一点,从而用客户特定的核心类覆盖核心类?

作为示例,这是一个核心类:

public class Shape
{
    public int Id { get; set; }
    public string Name { get; set; }
}

客户现在希望添加每种形状可以具有的颜色:

public class ShapeColor
{
    public int Id { get; set; }
    public string HexCode { get; set; }
    public int ShapeId { get; set; }

    public Shape Shape { get; set; }
}

数据库中的核心类未更改,但是我们需要一个导航属性才能为EF Core配置它:

public class Shape
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<ShapeColor> Colors { get; set; }
}

1 个答案:

答案 0 :(得分:3)

AppDbContext类应该是可继承的,而方法OnModelCreating是可以重写的。在派生的OnModelCreating类的DbContext方法中,添加以下代码以定义关系。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // modelBuilder.Entity<Shape>().HasKey(x=>x.Id);

    modelBuilder.Entity<ShapeColor>(x =>
    {
        // x.HasKey(p => p.Id);
        x.Property(p => p.ShapeId).IsRequired();
        x.HasOne<Shape>().WithMany().HasForeignKey(y => y.ShapeId);
    });
    base.OnModelCreating(modelBuilder);
}

此外,我已经使用Id属性在每个类中修饰了[Key]属性。如果您不想使用[Key]属性进行修饰,请使用Fluent表达式并定义Id属性。