Class 存储库模式中的映射错误
Class Mapping Error in repository pattern
我正在尝试在 EF Core 5 之上实现存储库模式。
我以这种方式定义了存储库及其接口:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, new()
{
protected readonly DbContext DbContext ;
public Repository(DbContext dbContext)
{
DbContext = dbContext;
}
public IQueryable<TEntity> GetAll()
{
try
{
return DbContext .Set<TEntity>();
}
catch (Exception ex)
{
throw new Exception($"Couldn't retrieve entities: {ex.Message}");
}
}
....
}
public interface IRepository<T> where T : class
{
IQueryable<T> GetAll();
}
现在我正在尝试创建一个 DataManager 以便使用注入实例化存储库并查询数据库,如下所示:
public class BaseController : ControllerBase
{
protected readonly DataManager dataManager;
[HttpGet]
public async Task<ActionResult> DoSomething()
{
Repository<MyEntity> entities= dataManager.GetRepository<MyEntity>();
return Ok(entities.GetAll().Where(w=>w.EntityId>123));
}
}
我试过像下面这样实现 DataManager:
public class DataManager : IDisposable
{
// keep one EFCore context per instance
private DbContext ctx;
public DataManager()
{
// create instance of context when DataManager is created
ctx = new DbContext();
}
/// <summary>
/// Dispose context if DataManager is disposed
/// </summary>
public void Dispose()
{
ctx.Dispose();
}
public Repository<TEntity> GetRepository<TEntity>()
where TEntity : class
{
Repository<TEntity> service = null;
var RepoName = "AuthenticationServer.Models.Repositories." + typeof(TEntity).Name + "Repository";
try
{
var type = Type.GetType(RepoName);
service = (Repository<TEntity>)Activator.CreateInstance(type, ctx);
}
catch (Exception e)
{
//default generic repo
service = new Repository<TEntity>(ctx);
}
return service;
}
}
但我在 public Repository GetRepository() 和 TEntity 上收到以下错误:
TEntity must be a non-abstract type with a public parameterless
constructor in order to use it as parameter 'TEntity' in the generic
type or method Repository
我该如何解决? 我想我在存储库模式中遗漏了一些东西
这是你对 Repository<TEntity>
的类型限制
Repository<TEntity> : IRepository<TEntity> where TEntity : class, new()
应该符合 GetRepository
的类型限制,但不符合。
public Repository<TEntity> GetRepository<TEntity>()
where TEntity : class
试试这个:
public Repository<TEntity> GetRepository<TEntity>()
where TEntity : class, new()
您的代码认为您可以使用没有无参数构造函数的类型调用 GetRepository
。但是 Repository
自己坚持认为必须如此。
我正在尝试在 EF Core 5 之上实现存储库模式。
我以这种方式定义了存储库及其接口:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, new()
{
protected readonly DbContext DbContext ;
public Repository(DbContext dbContext)
{
DbContext = dbContext;
}
public IQueryable<TEntity> GetAll()
{
try
{
return DbContext .Set<TEntity>();
}
catch (Exception ex)
{
throw new Exception($"Couldn't retrieve entities: {ex.Message}");
}
}
....
}
public interface IRepository<T> where T : class
{
IQueryable<T> GetAll();
}
现在我正在尝试创建一个 DataManager 以便使用注入实例化存储库并查询数据库,如下所示:
public class BaseController : ControllerBase
{
protected readonly DataManager dataManager;
[HttpGet]
public async Task<ActionResult> DoSomething()
{
Repository<MyEntity> entities= dataManager.GetRepository<MyEntity>();
return Ok(entities.GetAll().Where(w=>w.EntityId>123));
}
}
我试过像下面这样实现 DataManager:
public class DataManager : IDisposable
{
// keep one EFCore context per instance
private DbContext ctx;
public DataManager()
{
// create instance of context when DataManager is created
ctx = new DbContext();
}
/// <summary>
/// Dispose context if DataManager is disposed
/// </summary>
public void Dispose()
{
ctx.Dispose();
}
public Repository<TEntity> GetRepository<TEntity>()
where TEntity : class
{
Repository<TEntity> service = null;
var RepoName = "AuthenticationServer.Models.Repositories." + typeof(TEntity).Name + "Repository";
try
{
var type = Type.GetType(RepoName);
service = (Repository<TEntity>)Activator.CreateInstance(type, ctx);
}
catch (Exception e)
{
//default generic repo
service = new Repository<TEntity>(ctx);
}
return service;
}
}
但我在 public Repository GetRepository() 和 TEntity 上收到以下错误:
TEntity must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'TEntity' in the generic type or method Repository
我该如何解决? 我想我在存储库模式中遗漏了一些东西
这是你对 Repository<TEntity>
Repository<TEntity> : IRepository<TEntity> where TEntity : class, new()
应该符合 GetRepository
的类型限制,但不符合。
public Repository<TEntity> GetRepository<TEntity>()
where TEntity : class
试试这个:
public Repository<TEntity> GetRepository<TEntity>()
where TEntity : class, new()
您的代码认为您可以使用没有无参数构造函数的类型调用 GetRepository
。但是 Repository
自己坚持认为必须如此。