繁体   English   中英

MVC 4数据库第一个项目:在控制器的使用寿命内设置DBContext

[英]MVC 4 Database First project: Setting DBContext for the life of the controller

我不确定线程​​的标题是否真的可以解释我的意图,因此我将在此处进行更好的解释。 我是MVC的新手,并且我正在从事一个项目。 我正在连接到Firebird数据库,截至目前,我正在其中一个控制器的Index()中设置连接字符串和连接本身。 这样做的好处是,创建了连接,并将其列表按原样返回给View。 我可以回到视图,然后选择另一个数据库,它将连接到新数据库并正常显示结果。 我知道,做到这一点的更好方法是创建一个DAL类,我敢肯定,但是现在,请耐心等待。

所有这些都很棒。 当您尝试编辑,保存或删除任何内容时,遇到麻烦(您可能会想到)。 显然,这些方法正在查看dbContext,而DBContext没有任何改变。 DBContext不一定由我的连接代码“更新”。 我可以在需要时创建连接,但无法像控制器那样在生命周期内“设置”它。

基本上,我只是在寻求一些建议。 我一直在寻找StackOverflow,我想我已经找到了一些可能对我有帮助的信息,但是这仍然让我有些头疼。 只是试图掌握如何使用DBcontext动态更改整个控制器的连接字符串,而不仅是Index()。

提前致谢。

编辑以显示上下文代码

public partial class Entities : DbContext
{

    public Entities()
        : base("name=Entities")
    {
    }

    public Entities(string providerString)
        : base(new FbConnection(providerString), true)
    {
        this.Database.Connection.ConnectionString = providerString;
    }

这会在返回View()时产生错误; 指数。

更新的控制器代码:

            FbConnectionStringBuilder fbBuilder = new FbConnectionStringBuilder()
            {
                DataSource = dbsource,
                Database = dbdir,
                UserID = dbuser,
                Password = dbpwd,
                Dialect = 3,
                PacketSize = 8192
            };

            // Build the FbConnection connection string.
            FbConnection fbConn = new FbConnection(fbBuilder.ToString());

            db = new Entities(fbConn.ToString());

更新的DBCONTEXT:

public partial class Entities : DbContext
{

    public Entities(string fbConn)
        : base(new FbConnection(fbConn), true)
    {
    }

但是,这现在会产生错误:

提供了无效的连接字符串参数或未提供所需的连接字符串参数。

但这没有意义,因为如果我使用this.Database.Connection.ConnectionString,那么我可以连接,因此我知道它得到了一个很好的字符串。

两种选择:

最简单的

向控制器添加属性以保存DbContext ,然后添加将填充的无参数ctor(有效地为其赋予了使用寿命)。 例如

public class MyController : Controller
{
    private readonly DbContext context;
    public MyController()
    {
        this.context = new DbContext();
    }

    // rest of actions reference `context.<whatever>`
}

更多地参与

将控制反转(IoC)引入具有某种形式的依赖注入器(DI)的方程式中。 然后,让实例化程序将解析器放置在控制器中。 新的控制器签名如下所示:

public class MyController : Controller
{
    private readonly DbContext context;
    public MyController(DbContext context)
    {
        this.context = context;
    }

    // rest of actions reference `context.<whatever>`
}

注意:无参数的ctor消失了,但是DependencyResolver将在创建控制器的时候自动插入正确的实例。

从那里,您需要声明DI配置中的哪个实例。 以ninject为例,如下所示:

kernel.Bind<DbContexT>().To<MyDbContext>()
    // here's where scope comes in to play:
    // for ninject: https://github.com/ninject/ninject/wiki/Object-Scopes
    //.InTransientScope();
    //.InSingletonScope();
    //.InThreadScope();
    //.InRequestScope();

通过添加一些解决方法进行了修复。 在下面添加了代码:

Model.context.cs:

    public MyDatabaseContext()
        : base("name=MyDatabaseContextEntities")
    {
    }

    public MyDatabaseContext(string connectionString)
        : base("name=MyDatabaseContextEntities")
    {
        this.Database.Connection.ConnectionString = connectionString;
    }

控制器:

    public static string temporaryConnectionString
    {
        get;
        set;
    }

    FbConnectionStringBuilder fbBuilder = new FbConnectionStringBuilder()
    {
          //code to build your connection
    };

    //connectionString defined as a public variable
    connectionString = fbBuilder.ToString();

    //store to session variable in your DAL
    context.DataConnection.DAL.CurrentConnection = connectionString;
    temporaryConnectionString = connectionString;
    context = new MyDatabaseContext(connectionString);

    return View();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM