实体框架核心:扩展实体而无需部分

时间:2019-12-20 14:04:01

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

我必须扩展当前数据库实体(Foo)以包括新字段。听起来很简单,但是我很难解决。问题是,我无法为Foo创建局部类,因为它是我正在使用的dll的一部分。而且我无法按照我的要求请求修改Foo(或自己动手修改)。

我的项目结构与此类似:

// unmodifiable because part of dll
class Foo 
{
    int Id { get; set; }
    string Name { get; set; }
}

// unmodifiable because part of dll
interface IFooContext 
{
     DbSet<Foo> Foo { get; set; }
}

class FooContext: DbContext, IFooContext 
{
     DbSet<Foo> Foo { get; set; }
}

由于我对.net的了解有限,因此尝试了创建Bar类,并扩展了Foo,并希望用扩展类{{1}实现IFooContext就足够了}。

在下面您可以看到,但最终会出错,因为C#不允许使用可互换的扩展类用于父级。

Bar

我能做的是在class Bar: Foo { string Description { get; set; } //new field } class FooLoader: DbContext, IFooContext { DbSet<Bar> Foo; //error because DbSet<Foo> required } 内创建属性DbSet<Bar> Bar { get; set; },但是最后我得到两个几乎相同的数据库表:Foo和Bar。

因此,我进行了修改并创建了FooLoader类,其中将包含Bar。结果是两个表,其中FooId表引用了Bar

Foo

这两种情况都会创建一个我不确定的新表,如果我正在寻找的话。但是还有其他方法可以做到并将新字段包含在基类/表中吗?

1 个答案:

答案 0 :(得分:1)

代码优先方法为您提供了至少3个选项,可将(继承层次结构)实体映射到表:

  1. Table per Hierarchy (TPH)
  2. Table per Type (TPT)
  3. Table per Concrete Type (TPC)

您需要的是第一种方法,它将基类和继承关系映射到一个表,但是将添加另一列(默认名称为“ Discriminator”)以标识其UILabel,该列将当您从数据库查询整行时,可用于还原为它自己的类型。最重要的是:与其他两种方法相比,第一种方法也可以提供最佳性能。

这里有不错的帖子,您可以在其中找到实现方法:

  1. https://docs.microsoft.com/en-us/ef/core/modeling/relational/inheritance
  2. https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/inheritance?view=aspnetcore-3.1
  3. https://www.learnentityframeworkcore.com/inheritance/table-per-hierarchy

就像这样:

titleView

Type