我试图在我的MVC C#Entity Framework Application上创建一个通用控制器。
public class GenericRecordController<T> : Controller
{
private DbSet<T> Table;
// ...
public action(){
// ...
db.Entry(T_Instance).State = System.Data.Entity.EntityState.Modified;
}
}
然而,DbSet&lt; T &gt;并且 T_Instance 行有编译错误。
T 类型必须是引用类型才能将其用作参数。
当我为一个类
约束它时Controller where T : class
它已经解决了。
上述错误意味着什么?
我没有要求解决方案。我想理解为什么会出现这个错误以及为什么限制它来解决它。
答案 0 :(得分:20)
如果你看一下Db<TEntity>
的定义:
public class DbSet<TEntity> : DbQuery<TEntity>, IDbSet<TEntity>, IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable, IEnumerable, IInternalSetAdapter
where TEntity : class
因为它的type constraint
泛型类型必须是class
,所以必须使用与此条件匹配的类型对其进行初始化:
public class GenericRecordController<T> : Controller where T : class
{ ... }
答案 1 :(得分:7)
他们显然对泛型类型有约束。
您需要改变的是:
public class GenericRecordController<T> : Controller where T : class
这告诉编译器只能提供引用类型作为T的类型。
答案 2 :(得分:1)
您也可以使用一种方法来完成此操作:
public bool HasKey<T>(T obj) where T : class
{
return _db.Entry<T>(obj).IsKeySet;
}