我的公司拥有一个在所有客户之间共享的核心数据库架构,然后我们为每个客户提供了特定于客户的架构。核心数据库本身永远不会改变。我们正在为核心数据访问项目制作一个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; }
}
答案 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属性。