使用实体框架实现 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"

使用实体框架实现 CRUD 操作的通用存储库时出错

您需要

指定两个泛型约束,用于指定类型参数的现有约束(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);
}