我正在使用Entity Framework处理一个大型数据库(由200多个表组成)。
试图创建一个通用方法,返回特定表T(即类,可以是TableA)的DbSet<T>
。
使用实体数据模型自动生成的实体类如下:
public partial class sqlEntities : DbContext
{
public virtual DbSet<TableA> TableA { get; set; }
public virtual DbSet<TableB> TableB { get; set; }
public virtual DbSet<TableC> TableC { get; set; }
... // other methods
}
我的主类是这样的
public class TableModifier
{
// Should return first 10 elements from a table of that type T
public IQueryable<T> GetFromDatabase<T>() where T : EntityObject
{
try
{
using (sqlEntities ctx = new sqlEntities())
{
// Get the DbSet of the type T from the entities model (i.e. DB)
DbSet<T> dbSet = ctx.Set<T>();
return dbSet.Take(10);
}
}
catch (Exception ex)
{
// Invalid type was provided (i.e. table does not exist in database)
throw new ArgumentException("Invalid Entity", ex);
}
}
... // other methods
}
我需要在T上设置一个约束
where T : EntityObject
,以确保T处于EntityObject
的范围内。如果没有这样的约束,那么DbSet<T> dbSet
将会出现问题(即T必须是引用类型),因为它可能会得到更多意外的类型(基于此文)。当我尝试使用特定类型调用该方法时,就会出现问题。 [TestMethod]
public void Test_GetTest()
{
TableModifier t_modifier = new TableModifier();
// The get method now only accepts types of type EntityObject
IQueryable<TableA> i_q = t_modifier.GetFromDatabase<TableA>();
}
它报错了:
There is no implicit reference conversion from 'TableMod.TableA' to
'System.Data.Entity.Core.Objects.DataClasses.EntityObject'.
如果我知道实体模型中存在TableA
类型,我该如何将其转换为EntityObject
?
虽然这不是正确的语法(也不合逻辑),但这就是我想要的:
t_modifier.GetFromDatabase<(EntityObject)TableA>();
我该如何定义TableA
(以及其他200个表)类型作为EntityObject
的一部分?
一个可能的解决方案
结果证明我的限制条件过于具体,我只需要将T:IEntity
改为
where T : class
因此,T
是DbSet<T>
最初期望的类类型。
省去了将实现添加到200多个表类(TableA
,TableB
等)的麻烦。
当然还有其他问题,例如将返回类型从IQueryable<T>
更改为List<T>
,因为IQueryable
将在DbContext
(即sqlEntities
)的范围之外返回,从而使其无用。
TableMod.TableA
没有继承自EntityObject
? - DavidG