C# 在EF4.1代码中,首先介绍如何在Web.config中重写ConnectionString名称

C# 在EF4.1代码中,首先介绍如何在Web.config中重写ConnectionString名称,c#,asp.net,asp.net-mvc-3,entity-framework-4,ef-code-first,C#,Asp.net,Asp.net Mvc 3,Entity Framework 4,Ef Code First,我正在创建一个多租户Asp.NETMVC3Web应用程序,并首先为db模型使用EF4.1代码 对于开发,我很高兴在App_数据中使用SqlServerCE,对于生产,这将转移到sqlserver2008 假设我的上下文名为“MyModels”,默认情况下,代码首先在Web.config中查找名为“MyModels”的连接字符串。可以告诉它使用App_数据中的文件,或者在SQL2008中更改为访问数据库。到目前为止一切都很好 但由于多租户,我希望SqlServerCE文件名与租户的唯一id相匹配(

我正在创建一个多租户Asp.NETMVC3Web应用程序,并首先为db模型使用EF4.1代码

对于开发,我很高兴在App_数据中使用SqlServerCE,对于生产,这将转移到sqlserver2008

假设我的上下文名为“MyModels”,默认情况下,代码首先在Web.config中查找名为“MyModels”的连接字符串。可以告诉它使用App_数据中的文件,或者在SQL2008中更改为访问数据库。到目前为止一切都很好

但由于多租户,我希望SqlServerCE文件名与租户的唯一id相匹配(因此应用程序数据将具有“client_x.sdf”、“client_y.sdf”;SQLServer2008将具有单独的数据库)。我不知道如何指向这些不同的数据库

我尝试过从DbContext继承MyModels并提供连接字符串(在Web.config中使用“占位符”conn字符串并用唯一id替换“{clientId}”),还尝试过在MyModels构造函数中设置连接字符串:

base.Database.Connection.ConnectionString = xxx;
但这似乎从未奏效。我总是遇到以下错误:

运行时发生与网络相关或特定于实例的错误 建立到SQL的连接 服务器。找不到服务器,或者 无法访问。验证 实例名称正确,并且SQL 服务器配置为允许远程访问 连接。(提供程序:命名管道) 提供程序,错误:40-无法打开 与SQL Server的连接)

(这表明它尚未“配置”为使用SqlServerCE,因此正在尝试连接到SQLServer。我想!)

跟踪代码,Database.Connection.ConnectionString此时还没有从Web.config中读取,因此我无法搜索和替换它,并且,它可能会在稍后的管道中被“placeholder”conn字符串覆盖


我想这一定很简单,我就是找不到“钩子”。有人能帮忙吗?

我不确定这是否是解决您问题的可行方法。 我的想法是创建一个静态的“工厂”类来实例化DbContext类。代码如下所示:

public static class MyModelsFactory
{
    public static MyModels CreateMyModels()
    {
        string connectionString = string.Empty;
        // some code to retrieve your connectionString.
        return new MyModels(connectionString);
    }
}
您可以在需要实例化MyModels类的任何位置调用CreateMyModels方法:

using (MyModels models = MyModelsFactory.CreateMyModels())
{
    //your code
}

它适用于我需要在运行时根据某些逻辑更改连接字符串的情况。但是我的DbContext类是由classic EF自动生成的,而不是先编写代码。

我知道了,这是因为我有点笨。很抱歉我只是试图将ConnectionString设置为Web.config中的ConnectionString,但实际上我需要使用DbConnectionStringBuilder构建它。如果我替换生成器的ConnectionString属性,然后使用生成器设置EF conn字符串,它就会工作。

我已经找到了答案,这是因为我有点笨。很抱歉我只是试图将ConnectionString设置为Web.config中的ConnectionString,但实际上我需要使用DbConnectionStringBuilder构建它。如果我替换构建器的ConnectionString属性,然后使用构建器设置EF conn字符串,它就会工作。我可以把这个标记为已解决,谢谢!写下你评论的内容作为回答,并接受它。正如拉迪斯拉夫·姆恩卡所说,回答你自己的问题是完全可以的。我相信你必须等一天左右才能将自己的答案标记为“正确”答案,但这是允许的;)我也犯了同样的错误。一段代码显示字符串web.config的组成部分以及如何设置它,对我会有很大帮助。