【发布时间】:2021-06-22 14:48:45
【问题描述】:
在我正在进行的一个项目中,我在尝试从外部 NuGet 包向实体添加属性时遇到了一些麻烦。
外部团队最初使用 EntityFramework 来创建他们的数据库,不久前我的团队最初使用它来创建我们的数据库,现在有两个独立的数据库,但最初的创建使用了通用的 NuGet 包。
在外部团队方面,他们根本没有更改表,但在我们方面,我们向数据库添加了新的列和属性,现在我们需要在 DBContext 中使用它。如何将这些新字段映射到实体,以便我可以访问和设置属性。我希望它受到保护,但由于它是公开的,我不能只覆盖 DbSet<Profile> Profile 调用。
外部包:
- DataContext(扩展 DBContext 并具有
public DbSet<Profile> Profile {get;set;}的类) - 配置文件(映射到数据库中“配置文件”表的实体)
由于无法修改 Profile 类,我该如何添加表中的新列?
我最初的方法是创建:
- DataContextExt(扩展DataContext并添加
public DbSet<ProfileExt> ProfileExt {get;set;}的类 - ProfileExt(扩展 Profile 并具有不属于原始部分的附加字段的实体
这似乎让我走得最远,但由于 ProfileExt 扩展了 Profile,由于“鉴别器”列,我在使用它时遇到错误,因为它们在技术上都是同一个实体。
然后我尝试通过覆盖 OnModelCreating() 并将我的 ProfileExt 映射到 Profile 来删除 Profile,但同样失败了,它似乎根本没有更改模型构建器。
public class DataContextExt : DataContext
{
public DbSet<ProfileExt> ProfileExt { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Ignore<Profile>();
modelBuilder.Entity<ProfileExt>().ToTable("Profile");
Database.SetInitializer<ApplicationDbContext>(null);
}
}
有人对我接下来应该尝试什么有任何建议吗?
编辑: 目前,该项目旨在通过存储过程访问信息,然后我将其映射到我的 ProfileExt,但在保存时它被设计为使用
Entity = await DB.Set<TModel>().FindAsync(Key.Compile()(Model)).ConfigureAwait(false);
当模型到达这一点时,它是 ProfileExt 的实例
如果我尝试将 ProfileExt 通过(没有它自己的 DbSet)作为 Profile 传递,它会失败,说 ProfileExt 不在上下文中,如果我注册它(使用它自己的 DbSet)它会抛出鉴别器错误,因为它曾经是一个另一个实例。
【问题讨论】:
-
您是否尝试过添加阴影属性?
-
@TanveerBadar 所以现在它通过映射到 ProfileExt 模型的 SP 检索表的信息。但是,为了将值保存回数据库,它使用 DB.Set 函数失败,因为 ProfileExt 不是模型的一部分(如果我没有向 DbSet 注册它)或因为 Discriminator 列。 (查看更新后的帖子)
标签: c# database entity-framework