在Entity Framework中动态创建DbSet<T>?

31

在LINQ to SQL中,我可以使用 DataContext.GetTable<T> 动态创建一个仓储。在Entity Framework 4中是否有类似的方法,除了在特定的 DbContext 上声明属性?例如:

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

我想知道如何动态地创建/获取对 MySets 的引用,就像在LINQ to SQL中一样:

var mySet = MyDbContext.GetTable<MySet>();
3个回答

48

DbContext 有一个用于此的方法:

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

我在我的项目中使用了类似的东西,但是遇到了一个小问题。DbSet是动态创建的,内存图像工作得很好;然而,当将数据存储到数据库中时,例如context.SaveChanges(),会抛出以下异常:无效的对象名称'dbo.CustomModel'。 - ppoliani
看起来你的映射存在问题,因为它试图访问不存在的数据库对象。 - Ladislav Mrnka

21

使用:

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

或者,如果无法使用通用方法:

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

不必担心第二次加载和复制 POCO(Plain Old C# Object)。集合在 Context 内部被缓存。


2
这是我的方法:
    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>();

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接