C# 实体框架核心:扩展实体而不使用部分
我必须扩展当前数据库实体(C# 实体框架核心:扩展实体而不使用部分,c#,.net,entity-framework,.net-core,entity-framework-core,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 par
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; }
}
我所能做的就是在dougoader
内部创建属性DbSet Bar{get;set;}
,但随后我将得到两个几乎相同的数据库表:Foo和Bar
因此,我进行了修改并创建了类Bar
,其中将包含FooId
。它产生两个表,其中Bar
表引用了Foo
class Bar
{
int Id { get; set; }
Foo Foo { get; set; }
int FooId { get; set; }
string Description { get; set; }
}
这两种情况下,将创建一个新的表,我不确定,如果是我寻找的。但是,还有其他方法可以做到这一点并在基类/表中包含新字段吗?代码优先方法为您提供了至少3个选项来将(继承层次结构)实体映射到表: 您需要的是第1种方法,它将把基类和层次映射到一个表中,但会添加一个额外的列(“Discriminator”作为默认名称)来标识它们的
类型,当您从数据库查询整行时,该列将用于还原为自己的类型。最重要的是:与其他两种方法相比,第一种方法的性能也最好
以下是一些很好的帖子,您可以在其中找到实现:
就是这样,
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
....
modelBuilder.Entity<Foo>()
.HasDiscriminator<string>("FooType")
.HasValue<Foo>(nameof(Foo))
.HasValue<Bar>(nameof(Bar))
.HasValue<Other>(nameof(Other));
...
base.OnModelCreating(modelBuilder);
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
....
modelBuilder.Entity()
.HasDiscriminator(“FooType”)
.HasValue(名称(Foo))
.HasValue(条的名称)
.HasValue(名称(其他));
...
基于模型创建(modelBuilder);
}
或
modelBuilder.Entity()
.HasDiscriminator(“FooType”)
.HasValue(1)
.HasValue(2)
.HasValue(3);
当您无法访问dll时,为什么要扩展它?您可以在您的上下文中完全创建Bar模型(包括Foo的属性),对吗?因为它是框架guts的一部分,依赖于IFooLoader实现,我必须做的是提供它的实现。但同时,我需要为我的用例提供新的参数。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
....
modelBuilder.Entity<Foo>()
.HasDiscriminator<string>("FooType")
.HasValue<Foo>(nameof(Foo))
.HasValue<Bar>(nameof(Bar))
.HasValue<Other>(nameof(Other));
...
base.OnModelCreating(modelBuilder);
}
modelBuilder.Entity<Foo>()
.HasDiscriminator<int>("FooType")
.HasValue<Foo>(1)
.HasValue<Bar>(2)
.HasValue<Other>(3);