如何生成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。如果DbSets具有与旧实体类型相同的实体类型,则没有问题:

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

请注意,A实体/BE实体现在是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
}

相关内容

  • 没有找到相关文章

最新更新