我必须扩展当前数据库实体(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
这两种情况都会创建一个我不确定的新表,如果我正在寻找的话。但是还有其他方法可以做到并将新字段包含在基类/表中吗?
答案 0 :(得分:1)
代码优先方法为您提供了至少3个选项,可将(继承层次结构)实体映射到表:
您需要的是第一种方法,它将基类和继承关系映射到一个表,但是将添加另一列(默认名称为“ Discriminator”)以标识其UILabel
,该列将当您从数据库查询整行时,可用于还原为它自己的类型。最重要的是:与其他两种方法相比,第一种方法也可以提供最佳性能。
这里有不错的帖子,您可以在其中找到实现方法:
就像这样:
titleView
或
Type