Entity framework 具有实体框架和MVC4构建动态连接字符串的存储库模式

Entity framework 具有实体框架和MVC4构建动态连接字符串的存储库模式,entity-framework,asp.net-mvc-4,.net-4.5,repository-pattern,dbcontext,Entity Framework,Asp.net Mvc 4,.net 4.5,Repository Pattern,Dbcontext,在使用EF6实现MVC4的存储库模式[UoW]时,我面临一个问题 错误:“XX.DataAccess.Context”必须是具有公共无参数构造函数的非抽象类型,才能在泛型类型或方法“XX.DataAccess.WriteRepository”中将其用作参数“TContext” //Data Access layer Class for Saving/Deleting/Retriving etc. Inherits WriteRepository public class Common : Wri

在使用EF6实现MVC4的存储库模式[UoW]时,我面临一个问题

错误:“XX.DataAccess.Context”必须是具有公共无参数构造函数的非抽象类型,才能在泛型类型或方法“XX.DataAccess.WriteRepository”中将其用作参数“TContext”

//Data Access layer Class for Saving/Deleting/Retriving etc. Inherits WriteRepository
public class Common : WriteRepository<Context>, ICommon
{
    //Method
}

//Repository Pattern
public abstract class WriteRepository<TContext> : IWriteRepository where TContext : DbContext, new()
{
    private readonly TContext _context;

    protected TContext Context { get { return _context; } }

    protected WriteRepository()
    {
        _context = new TContext();
    }

//Save Method

//Delete Method

//Retrive Method

//Find Method
}
//用于保存/删除/检索等的数据访问层类继承WriteRepository
公共类公共:WriteRepository,ICommon
{
//方法
}
//存储库模式
公共抽象类WriteRepository:IWriteRepository,其中TContext:DbContext,new()
{
私有只读TContext\u上下文;
受保护的TContext上下文{get{return}
受保护的WriteRepository()
{
_context=新的TContext();
}
//保存方法
//删除方法
//检索法
//查找方法
}
//数据库上下文类 //这里我需要构建动态连接字符串,该字符串以客户机ID为参数。如果我在参数中使用它,它会给出上面提到的数据访问方法实现的错误

public partial class Context : DbContext
{
    static Context ()
    {
        Database.SetInitializer<Context>(null);
    }

    public Context (int ClientID = 0)
        : base(ConnectionString(ClientID))
    {
        var objContext = (this as IObjectContextAdapter).ObjectContext;
        objContext.CommandTimeout = 180;
    }

//DBSet's

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    //Mapping
}

private static string ConnectionString(int ClientID = 0)
    {
    //return connection string
}
}
公共部分类上下文:DbContext
{
静态上下文()
{
Database.SetInitializer(null);
}
公共上下文(int ClientID=0)
:base(连接字符串(ClientID))
{
var objContext=(作为IObjectContextAdapter);
objContext.CommandTimeout=180;
}
//数据库集
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//映射
}
私有静态字符串连接字符串(int-ClientID=0)
{
//返回连接字符串
}
}

请告诉我需要做哪些更改才能使其正常工作。

问题在于
new()
WriteRepository
的约束。无法满足约束,因为
Context
没有零参数构造函数,因为在创建
ClientID
时需要将其传入。因此,请删除
new()
约束,改为修改
WriteRepository
构造函数以获取
TContext
类型的参数:

//Repository Pattern
public abstract class WriteRepository<TContext> : IWriteRepository where TContext : DbContext
{
    private readonly TContext _context;

    protected TContext Context { get { return _context; } }

    protected WriteRepository(TContext context)
    {
        _context = context;
    }

    //Save Method

    //Delete Method

    //Retrive Method

    //Find Method

}

当然,已经从
WriteRepository
派生的任何其他类也需要修改。我希望这有帮助

你好,卢卡桑。谢谢你的帮助。实际上,如果指定此方法,则每次ClientID都将为0。目标是从UI->Business->Data Access发送客户端ID。这是一个多线程数据库,我想知道选择了哪个客户端。基于这个客户端,我将构建上面代码中提到的动态连接字符串。我将从我们的集中式数据库中获得它[没有在代码中实现它,但它更容易实现]。按照你给出的方法,它将始终为零。还可以做些什么?有什么想法吗?公共上下文():这(0){}对不起,我部分误解了你的问题。我已经更新了我的答案来解决这个问题。。非常感谢你。。已解决:)您提到的代码中只有一处更改。public WriteRepository(int clientID):要更改为的基(新上下文(clientID))。。公共(int-clientID):基本(新上下文(clientID)),它工作得非常好:)Thx兄弟…很高兴它成功了。。。请别忘了投票/接受我的答案,这样我会得到一些分数
//Data Access layer Class for Saving/Deleting/Retriving etc. Inherits WriteRepository
public class Common : WriteRepository<Context>, ICommon
{
    public Common(int clientID)
        :base(new Context(clientID))
    {

    }
}