【问题标题】:Create a DbSet<T> dynamically in Entity Framework?在实体框架中动态创建 DbSet<T>?
【发布时间】:2011-07-15 13:35:21
【问题描述】:

在 LINQ to SQL 中,我可以使用 DataContext.GetTable&lt;T&gt; 动态创建存储库。除了在特定的DbContext 上声明属性之外,在 Entity Framework 4 中是否有类似的方法来执行此操作?例如:

public MyDbContext: DbContext
{
    public DbSet<MySet> MySets {get; set;}
}

我想知道如何使用 LINQ to SQL 动态创建/获取对MySets 的引用:

var mySet = MyDbContext.GetTable<MySet>();

【问题讨论】:

    标签: c# linq-to-sql entity-framework-4 ef-code-first dbset


    【解决方案1】:

    DbContext 有这个方法:

      var set = context.Set<MyEntity>();
    

    【讨论】:

    • 我在我的项目中使用了类似的东西,但遇到了一个小问题。 DbSet 是动态创建的,内存中的图工作得很好;但是,当需要将数据存储到数据库中时,例如context.SaveChanges() 抛出以下异常:无效的对象名称'dbo.CustomModel'。
    • 您的映射似乎有问题,因为它试图访问不存在的 db 对象
    【解决方案2】:

    用途:

    DbSet<MyEntity> set = context.Set<MyEntity>();
    

    或者,如果你不能使用泛型方法:

    DbSet set = context.Set(
        typeof( MyEntity )
    );
    

    不必担心二次加载和复制 POCO。集合由 Context 在内部缓存。

    【讨论】:

      【解决方案3】:

      这是我的方法:

          public static List<T> GetCollection<T>()
          {
              List<T> lstDynamic = null;
      
              using (MyDbContext db = new MyDbContext())
              {
                  DbSet mySet = db.Set(typeof(T));
                  mySet.Load();
                  var list = mySet.Local.Cast<T>();
      
                  lstDynamic = list.ToList();
              }
              return lstDynamic;
           }
      

      你称这个函数为:

      List<Customer> lst = StaticClass.GetCollection<Customer>();
      

      这将返回您的整个集合。我用它来为不经常更改其内容的基本表执行缓存功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-22
        • 2013-04-10
        • 2016-12-21
        • 1970-01-01
        • 1970-01-01
        • 2013-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多