【问题标题】:Error on implementing generic Repository for CRUD operations using Entity Framework使用实体框架为 CRUD 操作实现通用存储库时出错
【发布时间】:2016-01-22 16:52:54
【问题描述】:

我有一个问题,我想从我的泛型类中获取表格:

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 : class 替换为 TEntity : IEntity 我会收到此错误:

类型“TEntity”必须是引用类型才能在泛型类型或方法“System.Data.Entity.DbContext.Set()”中用作参数“TEntity”

【问题讨论】:

    标签: c# entity-framework linq generics


    【解决方案1】:

    你需要指定两个泛型约束,你已经拥有的(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);
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多