2011-03-23 31 views
5

'daki ConnectionString adının nasıl geçersiz kılınacağı, çok kiracılı bir Asp.Net MVC 3 Web uygulaması oluşturuyor ve ilk olarak db modeli için EF4.1 kodunu kullanıyorum.İlk olarak, EF4.1 kodunda, Web.config

gelişimi için

Ben App_Data içinde SqlServerCE kullanmak mutluyum ve üretim için bu bir bağlantı dizesi için varsayılan kod ilk bakışlarla, 2008.

Bağlam "MyModels" denir Say SQL Server hareket edecek Web.config içinde "MyModels" denir. Bu, App_Data'da bir dosyayı kullanması veya SQL2008'deki bir veritabanına erişmesi için değiştirilebileceği söylenebilir. Şimdiye kadar her şey yolunda.

Ancak çok kiracılılık nedeniyle, SqlServerCE dosya adının kiracının benzersiz kimliğiyle eşleşmesini isterim (bu nedenle App_Data "client_x.sdf", "client_y.sdf" olurdu; Sql Server 2008'in ayrı veritabanları olur.). Bu farklı veritabanlarına nasıl yönlendirilebileceğimi bilemiyorum.

DbContext öğesinden devralma ve bir bağlantı dizesi sağlama (Web.config dosyasında bir 'yer tutucu' bağlantı dizesi kullanarak ve benzersiz bir kimlikle "{clientId}" değiştiren MyModeller denedim ve ayrıca MyModels yapıcısındaki bağlantı dizgisi:

fakat bu hiç işe yaramaz.

kodu, veritabanı izleme (.! Bu bence Sql Server'a bağlanmaya çalıştığı nedenle şu anda SqlServerCE kullanmak 'yapılandırılan' değil önerir ve)

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)

: Hep aşağıdaki hatayı alıyorum .Connection.ConnectionString, bu noktada Web.config dosyasından okunmamıştır, bu yüzden bunu arayamıyorum ve değiştiremiyorum ve muhtemelen, daha sonra boru hattında 'yer tutucu' bağlantı dizesi tarafından üzerine yazılıyor.

Bunun çok basit olması gerektiğini düşünüyorum ve sadece 'kanca' bulamıyorum. Herkes yardım edebilir mi?

+0

Bunu anladım, çünkü biraz aptalım. Afedersiniz! Sadece ConnectionString'i Web.config'ten connectionString olarak ayarlamaya çalışıyordum, ancak aslında DbConnectionStringBuilder kullanarak onu oluşturmam gerekiyor. Oluşturucunun ConnectionString özelliğini değiştirirseniz, EF bağlantı dizesini ayarlamak için oluşturucuyu kullanın, çalışır. Bunu çözülmüş olarak işaretleyerek yapabilirim, lütfen! –

+3

Yorumunuzun içeriğini bir cevap olarak yazın ve kabul edin. –

+0

Ladislav Mrnka'nın belirttiği gibi, kendi sorunuzu cevaplamak tamamen uygun.Kendi cevabınızı "cevap" olarak işaretlemeden önce bir gün beklemeniz gerektiğine inanıyorum ama izin verilir;) –

cevap

1

Bunu anladım, çünkü biraz aptalım. Afedersiniz! Sadece ConnectionString'i Web.config'ten connectionString olarak ayarlamaya çalışıyordum, ancak aslında DbConnectionStringBuilder kullanarak onu oluşturmam gerekiyor. Oluşturucunun ConnectionString özelliğini değiştirirseniz, EF bağlantı dizesini ayarlamak için oluşturucuyu kullanın, çalışır.

+2

Aynı hataları alıyorum. Hangi bölüm web.config dize kılan bir parça kod ve aksi halde nasıl ayarlamak için MUCH yardım bana olurdu. – jp2code

1

Sorununuzu çözmek için olası bir yaklaşım olup olmadığından emin değilim. Benim fikrim, DbContext sınıfınızı başlatmak için statik bir "fabrika" sınıfı oluşturmaktır.

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

Ve MyModels sınıf örneğini oluşturmak için ihtiyaç duyduğunuz her yerde yöntem CreateMyModels çağırabilir: kod aşağıdaki gibi olduğunu O durumda benim için çalışıyor

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

Ben göre bağlantı dizesini değiştirmeniz gerekir çalışma zamanında bazı mantık. Ama benim DbContext sınıfım, kod ilk olarak klasik EF tarafından otomatik olarak üretilir.