首页 文章

DbContext与动态DbSet

提问于
浏览
1

是否有可能只有一个属性为IDbSet的DbContext,而不是具体IDbSet的集合,例如DbSet .

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

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

我不想创建多个DbSets,例如

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

实际上我试图使用那个通用的DbSet,但似乎有一个问题 . DbContext不会在数据库中创建相应的表 . 因此,虽然我可以使用内存中的实体图,但是当将entites存储到数据库中时,会抛出异常(无效的对象名称'dbo.Product' . )

有没有办法强制EF创建对应dynamicrate创建DbSets的表?

1 回答

  • 1

    Yes you can do this.

    modelBuilder.Configurations.Add
    

    将导出DBSet条目 .

    如果你打算使用POCO,只需用这种方式构建模型即可 . 所以你保存手动DBSet <>声明......

    但如果你打算在没有POCO的情况下更加动态......

    在沿着这条路走下去之前,有很多事情需要考虑 .

    • 您选择了正确的ORM吗?

    • 你打算有POCO吗?

    • 为什么选择DbSet产品{get;组; } 太糟了 ?
      你会为这一行代码获得很多动作 .

    • 您打算在没有类型DBS的情况下使用什么数据访问方法

    • 您打算使用Linq to Entity语句吗?

    • 您是否计划为必要的动态数据访问创建表达式树 . 由于类型在编译时是未知的 .

    • 您打算使用数据库模型缓存吗?

    • 如何管理缓存,尤其是在Web中 . ASP环境 .

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

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

    通常,在创建派生上下文的第一个实例时,仅调用此方法一次 . 然后缓存该上下文的模型,该模型适用于app域中上下文的所有其他实例 . 可以通过在给定的ModelBuidler上设置ModelCaching属性来禁用此缓存,但这会严重降低性能 . 通过直接使用DbModelBuilder和DbContext类,可以更好地控制缓存 .

    The modelbuilder class

    祝好运

相关问题