如何生成IDbSet而不是DbSet

时间:2018-10-30 10:27:02

标签: c# entity-framework edmx-designer

我是C#EntityFramework的新手,我需要维护一个活动的软件。 我需要创建一个新表,以便在数据库中创建它,然后使用EntityFramework更新我的模型。

Howewer,看起来以前的开发人员一直在用生成的代码(Mode.Context.cs类)和EntityFramework直接编写代码,而更新模型时会擦拭并完全重写它。

所以我做了一个新的局部类Model。看起来像这样:

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

处理该问题的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

通常,代表您的数据库的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的实体类型与旧的相同,则没有问题:

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
}