使用实体框架实现 CRUD 操作的通用存储库时出错
本文关键字:存储 出错 操作 实体 框架 实现 CRUD | 更新日期: 2023-09-27 18:31:26
我有一个问题,我想从我的泛型类中获取表:
public virtual TEntity GetById(int id)
{
return _db.Set<TEntity>().FirstOrDefault(c => ((IEntity)c).Code == id);
}
但Linq
不能投IEntity
public abstract class BaseRepository<TEntity, M> : IRepository<TEntity> where TEntity : class where M : new()
如果替换为TEntity : IEntity
TEntity : class
,则会收到此错误:
类型"TEntity"必须是引用类型,才能在泛型类型或方法"System.Data.Entity.DbContext.Set()"中将其用作参数"TEntity"
您需要
指定两个泛型约束,用于指定类型参数的现有约束(class
必须是引用类型,以及一个接口约束以指定TEntity
必须实现IEntity
接口:
^^here^^
public abstract class BaseRepository<TEntity, M> : IRepository<TEntity> where TEntity : class, IEntity where M : new()
之后,您应该能够执行此操作:
public virtual TEntity GetById(int id)
{
return _db.Set<TEntity>().FirstOrDefault(c => c.Code == id);
}
但无论如何,我想建议如果你正在创建一个通用存储库,你的GetById
方法应该"更灵活",例如你可以执行以下操作:
public virtual TEntity Find(params object[] keyValues)
{
return _db.Set<TEntity>().Find(keyValues);
}