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)。保存文件并重新生成代码。