1

是否可以有一个 DbContext,它只有一个泛型类型 IDbSet 的属性,而不是具体 IDbSet 的集合,例如 DbSet。

更具体地说,我只想创建一个通用 DbSet,其中将动态确定实际类型,例如

 public new IDbSet<T> Set<T>() where T : class
 {
     return context.Set<T>();
 }

我不想创建多个 DbSet,例如

DbSet<product> Products { get; set; }
...

实际上,我尝试使用该通用 DbSet,但似乎存在一个问题。DbContext 不会在数据库中创建相应的表。因此,尽管我可以使用内存中的实体图,但当需要将实体存储到数据库中时,会引发异常(无效的对象名称 'dbo.Product'。)

有什么方法可以强制 EF 创建对应于动态创建 DbSet 的表?

4

1 回答 1

1

是的,你可以这样做。

modelBuilder.Configurations.Add

将派生 DBSet 条目。

如果您打算使用 POCO 并以这种方式构建模型,则可以。所以你保存 Manual DBSet<> 声明......

但是,如果您打算在没有 POCO 的情况下变得更加动态......

在你走这条路之前,有很多事情需要考虑。

  • 你选对了 ORM 吗?
  • 你打算有一个 POCO 吗?
  • 为什么 DbSet Products { get; 放; } 太糟了 ?
    对于那 1 行代码,您可以获得很多操作。
  • 您计划在没有类型 DBSet 的情况下使用什么数据访问方法
  • 您打算使用 Linq to Entity 语句吗?
  • 您是否计划为必要的动态数据访问创建表达式树。由于类型在编译时未知。
  • 你打算使用数据库模型缓存吗?
  • 如何管理缓存,尤其是在 Web 中。ASP 环境。

我很可能确实想到了其他问题。自己构建模型是一项艰巨的任务。当不使用编译时类型/POCO 并且模型缓存和性能成为关键管理任务时,Linq 访问会受到影响。

这个任务的实际方面是不要低估从这里开始 bContext.OnModelCreating

通常,此方法仅在创建派生上下文的第一个实例时调用一次。然后缓存该上下文的模型,并用于应用程序域中上下文的所有进一步实例。可以通过在给定的 ModelBuidler 上设置 ModelCaching 属性来禁用此缓存,但这会严重降低性能。通过直接使用 DbModelBuilder 和 DbContext 类来提供对缓存的更多控制。

模型构建器类

祝你好运

于 2013-09-24T08:46:12.903 回答