C# 如何生成IDbSet而不是DbSet
我是C# 如何生成IDbSet而不是DbSet,c#,entity-framework,edmx-designer,C#,Entity Framework,Edmx Designer,我是C#和EntityFramework新手,需要维护一个活动的软件。 我需要创建一个新表,所以我在数据库中创建了它,然后用EntityFramework更新了我的模型 但是,看起来以前的开发人员在更新模型时直接在生成的代码(Mode.Context.cs类)和EntityFramework中编写代码,并将其完全擦除和重写 所以我做了一个新的部分类模型。看起来是这样的: public partial class Model : DbContext, IModel { pu
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; }
}
生成的模型如下所示:
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; }
}
公共部分类模型:DbContext
{
公共模型()
:base(“名称=型号”)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
抛出新代码FirstException();
}
公共DbSet ARandomTable{get;set;}
}
然而,问题是以前,模型使用的是IDbSet
而不是DbSet
,接口IModel
要求IDbSet ARandomTable
处理这个问题的正确方法是什么?通常表示数据库的
Dbcontext
有几个DbSet
属性,其中每个DbSet
表示数据库中的一个表
tenty
的所有非虚拟属性表示表中的列;tenty
的虚拟属性表示表之间的关系:一对多、多对多等
每个DbSet
都实现了idset
,因此无论旧的DbContext
在哪里使用了idset
,您都可以给它相应的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
}
}
类myoldbcontext:DbContext
{
公共IDbSet实体{get;set;}
公共IDbSet属性{get;set;}
公共方法()
{//此方法使用IdBsets AEnties和Benties:
IDbSet x=this.aenties;
IDbSet y=this.benties;
…//用x和y做点什么
}
}
现在是新的DbContext。如果数据库集具有与旧数据库集相同的实体类型,则没有问题:
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
}
}
类MyNewDbContext:DbContext
{
公共数据库集实体{get;set;}
公共DbSet benties{get;set;}
公共方法()
{//此方法使用DbSets AEntities和BEntities,它们实现IDbSet
IDbSet x=this.aenties;
IDbSet y=this.benties;
…//用x和y做点什么
}
}
请注意,AEnties/benties现在是DbSet
,而不是IDbSet
。因为每个DbSet
都实现了IDbSet
,所以您的问题就解决了
如果你的新桌子和旧桌子不一样,那就有点难了。在这种情况下,您必须编写适配器属性,返回预期的IDbSet
类MyNewDbContext:DbContext
{
公共数据库集{get;set;}
公共数据库集学生{get;set;}
公共方法()
{//此方法使用AENTITY和BENTITY的IdBset:
IDbSet x=this.aenties;
IDbSet y=this.benties;
…//用x和y做点什么
}
//对于某些随机方法,我们需要属性A、实体和边界
//使用新的数据库集模仿旧的实体和本蒂
私有IDbSet AEntities=>this.Teachers
.加入(这个学生…)
.其中(…)
。选择(…);
//类似于Benties
}
稍微更新一下代码,这个IModel
只能要求使用SomeRandomMethod()。请明确您的代码是什么,以及为什么需要IDbSet中的I。如果生成工具使用T4,则只需更新T4模型即可。@CodeNotFound谢谢,已使用模板对其进行了修改。只是需要一个提示来看看:)你使用的是哪种gneration工具?如果是T4模板,则转到文件并查看设置IDbSet
的行(CTRL+F)。保存文件并重新生成代码。