【发布时间】:2021-02-10 15:57:11
【问题描述】:
我有一个通用类将扮演存储库角色,我还有第二个类,第二个类应该在构造函数中从通用存储库接收一个对象。
通用类(存储库):
public sealed class Repo<TContext> : IRepo<TContext>, IDisposable where TContext : DbContext, IDbContextFactory<TContext>, new()
{
#region properties
/// <summary>
/// Private DBContext property
/// </summary>
private DbContext _Context { get; } = null;
/// <summary>
/// Determine if Lazy Loading either activate or not
/// </summary>
private bool _LazyLoaded { get; set; }
#endregion
#region Construcors
public Repo(bool LazyLoaded)
{
_Context = new TContext();
_LazyLoaded = LazyLoaded;
_Context.ChangeTracker.LazyLoadingEnabled = LazyLoaded;
}
public Repo(DbContext context,bool LazyLoaded)
{
_Context = context;
_LazyLoaded = LazyLoaded;
_Context.ChangeTracker.LazyLoadingEnabled = LazyLoaded;
}
public Repo(IConfiguration configuration, string connectionString,bool LazyLoaded)
{
_Context = new TContext().GetInstance(configuration, connectionString);
_LazyLoaded = LazyLoaded;
_Context.ChangeTracker.LazyLoadingEnabled = LazyLoaded;
}
#endregion
}
我在第二节课上尝试了什么:
class UOW:IUOW
{
public UOW(Repo<DbContext> repo)
{
}
public void Commit()
{
}
public void RollBack()
{
}
}
但是我得到了这两个错误:
CS0311 类型“Microsoft.EntityFrameworkCore.DbContext”不能用作泛型类型或方法“Repo”中的类型参数“TContext”。没有从“Microsoft.EntityFrameworkCore.DbContext”到“Microsoft.EntityFrameworkCore.IDbContextFactory
”的隐式引用转换。
CS0310 'DbContext' 必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法 'Repo' 中的参数 'TContext'
如何配置我的第二个类的构造函数以接收来自 repo 泛型类的对象?
【问题讨论】:
-
该错误与构造函数本身无关,而是
DbContext类型似乎缺少空构造函数。而且它没有实现IDbContextFactory -
解决此问题的任何解决方案或建议
-
DbContext不是非抽象类型,因此您不能将其与new()通用约束一起使用。它也没有实现IDbContextFactory -
声明无参数构造函数并实现
IDbContextFactory。但对我来说,它似乎更像是XY problem 的一个例子。你为什么要它有这个属性? -
另外,请不要张贴代码/错误信息的图片,在以后的问题中包含实际内容。
标签: c# generics repository unit-of-work