c# - 如何生成 IDbSet 而不是 DbSet
问题描述
我是新手C#
, EntityFramework
我需要维护一个活跃的软件。我需要创建一个新表,所以我在数据库中创建了它,然后使用 EntityFramework 更新了我的模型。
但是,看起来以前的开发人员一直在直接在生成的代码(Mode.Context.cs
类)中编写代码,并且EntityFramework
在更新模型时正在擦除它并完全重写它。
所以我做了一个新的部分类模型。它看起来像这样:
public partial class Model : DbContext, IModel
{
public void SomeRandomMethod();
}
生成的模型如下所示:
public partial class Model : DbContext
{
public Model()
: base("name=Model")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public DbSet<RandomTable> ARandomTable { get; set; }
}
然而,问题是,以前,模型使用IDbSet
而不是,DbSet
界面IModel
要求IDbSet<RandomTable> ARandomTable
处理这个问题的正确方法是什么?
解决方案
通常Dbcontext
,代表您的数据库的 有几个DbSet<TEntity>
属性,其中每个DbSet
代表数据库中的一个表。
的所有非虚拟属性TEntity
代表表中的列;的虚拟属性TEntity
表示表之间的关系:一对多、多对多等。
每一个DbSet<TEntity>
实现IDbSet<TEntity>
,所以无论你的老DbContext
使用一个IDbSet
,你可以给它相应的DbSet
代替。
如果我理解正确,您的旧DbContext
有一些已实现的属性IDbSet<...>
,并且方法SomeRandomMethod
使用了这些属性。
class MyOldDbContext : DbContext
{
public IDbSet<Aentity> Aentities {get; set;}
public IDbSet<Bentity> BEntities {get; set;}
public void SomeRandomMethod()
{ // this method uses the IdBsets AEntities and BEntities:
IDbSet<AEntity> x = this.AEntities;
IDbSet<BEntity> y = this.BEntities;
... // do something with x and y
}
}
现在你的新 DbContext。如果 DbSet 的 Entity 类型与旧的相同,则没有问题:
class MyNewDbContext : DbContext
{
public DbSet<Aentity> Aentities {get; set;}
public DbSet<Bentity> BEntities {get; set;}
public void SomeRandomMethod()
{ // this method uses the DbSets AEntities and BEntities, which implement IDbSet
IDbSet<AEntity> x = this.AEntities;
IDbSet<BEntity> y = this.BEntities;
... // do something with x and y
}
}
请注意,AEntities/BEntities 现在DbSet<...>
不是IDbSet<...>
. 因为每一个DbSet<...>
工具IDbSet<...>
,你的问题都解决了。
如果您的新表与旧表不同,那就有点困难了。在这种情况下,您必须编写适配器属性,返回预期的IDbSet<...>
class MyNewDbContext : DbContext
{
public DbSet<Teacher> Teachers {get; set;}
public DbSet<Student> Students {get; set;}
public void SomeRandomMethod()
{ // this method uses the IdBset of AEntities and BEntities:
IDbSet<AEntity> x = this.AEntities;
IDbSet<BEntity> y = this.BEntities;
... // do something with x and y
}
// for SomeRandomMethod we need properties AEntities and BEntities
// use your new DbSets to mimic the old AEntities and BEntities
private IDbSet<AEntity> AEntities => this.Teachers
.Join(this.Students, ...)
.Where(...)
.Select(...);
// similar for BEntities
}
推荐阅读
- python - 如何将代码从 python 复制到 GitHub?
- python - Python - Kivy:使用 ScreenManager 进行文本输入的 KeyError
- python - docker-compose 容器端口未显示在本地主机上
- python - csv 数据到数组中的多个字典
- c# - 我的日历第一次没有改变
- c++ - 代码不使用 istream() 读取文件“*.in”C++
- python - Python - 没有窗口时如何保持 Gtk.Application 运行?
- amazon-web-services - AWS CodeBuild 批量构建列表未针对每个构建标识符运行阶段
- windows-10 - 使用 Ngrok 进行远程桌面连接
- macos - 如何在 AppleScriptObj 中获取 NSImage.Name