首页 > 解决方案 > 如何生成 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

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

标签: c#entity-frameworkedmx-designer

解决方案


通常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
}

推荐阅读