2011-03-23 60 views
5

我正在创建一个多租户Asp.Net MVC 3 Web应用程序,并首先使用EF4.1代码为db模型。在EF4.1代码中,如何覆盖Web.config中的ConnectionString名称

对于发展我很高兴能在App_Data文件使用SqlServerCE,以及​​生产这种将移动到SQL Server 2008

说我的情况下被称为“MyModels”,默认情况下,代码首先查找连接字符串在Web.config中称为“MyModels”。这可以被告知在App_Data中使用文件或者在SQL2008中更改为访问数据库。迄今为止都很好。

但由于多租户,我希望SqlServerCE文件名与租户的唯一ID相匹配(所以App_Data将具有“client_x.sdf”,“client_y.sdf”; Sql Server 2008将具有单独的数据库)。我无法弄清楚如何指导这些不同的数据库。

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

base.Database.Connection.ConnectionString = xxx; 

但这似乎从来没有工作。我总是得到以下错误:

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

(这意味着它没有“配置”使用SqlServerCE,所以尝试连接到SQL Server,我认为!)

跟踪代码,数据库.Connection.ConnectionString在此时尚未从Web.config中读取,因此我无法搜索并替换该文件,并且可能会在稍后在管道中被“占位符”conn字符串覆盖。

我认为这一定很简单,我找不到'钩子'。任何人都可以帮忙吗?

+0

我弄明白了,这是因为我有点笨。抱歉!我只是试图将ConnectionString设置为来自Web.config的connectionString,但实际上我需要使用DbConnectionStringBuilder来构建它。如果我替换构建器的ConnectionString属性,那么使用构建器设置EF连接字符串,它可以工作。我可以将这标记为已解决,请! – 2011-03-23 10:52:34

+3

将评论内容写为答案并接受。 – 2011-03-23 20:06:14

+0

Ladislav Mrnka说,回答你自己的问题完全可以。我相信你必须等待一天左右,然后才可以将自己的答案标记为“答案”,但它是允许的;) – 2011-03-24 09:39:17

回答

1

我弄明白了,这是因为我有点笨。抱歉!我只是试图将ConnectionString设置为来自Web.config的connectionString,但实际上我需要使用DbConnectionStringBuilder来构建它。如果我替换构建器的ConnectionString属性,那么使用构建器设置EF连接字符串,它可以工作。

+2

我收到了同样的错误。一些代码显示了字符串web.config的内容以及如何设置,这对我来说会有很大的帮助。 – jp2code 2011-05-24 16:04:22

1

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

public static class MyModelsFactory 
{ 
    public static MyModels CreateMyModels() 
    { 
     string connectionString = string.Empty; 
     // some code to retrieve your connectionString. 
     return new MyModels(connectionString); 
    } 
} 

你可以叫CreateMyModels方法,无论你需要实例MyModels类:

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

这对我的作品的情况下,我需要改变根据连接字符串运行时的一些逻辑。但是我的DbContext类是由传统的EF自动生成的,而不是第一个代码。