2015-04-03 26 views
17

Uygulamamızın hem ADO.NET hem de Entity Framework'ü kullandığı karma bir ortamdayız.
Her ikisi de aynı fiziksel SQL sunucusuna işaret ettiğinden, Entity Framework bağlantı dizesini yapılandırma dosyasından kaldırmak ve dizeyi geçerli ADO.NET bağlantı dizelerini temel alarak otomatik olarak oluşturmak istiyoruz.
Bu, geliştiricinin ADO.NET dizesini değiştirdiği, ancak Entity Framework bağlantı dizesini değiştirmeyi unutduğu hatalardan kurtarır.Entity Framework 6 set bağlantı dizesi çalışma zamanı

Bunu okudum ama soruya cevap vermediler.
How do I create connection string programmatically to MS SQL in Entity Framework 6?

Kendi DbConnection oluşturmak ve DBContext (ExistingConnection, contextOwnsConnection) o zaman bir hata atar o geçerseniz "bağlam için bir EDMX dosyasından oluşturulan kodla Kod İlk modunda kullanılıyor ya Veritabanı İlk veya Model İlk geliştirme. "

Kod İlk kullanmıyorum.

https://msdn.microsoft.com/en-us/data/jj680699
Bu, EF 6'daki kod tabanı yapılandırması hakkında konuştu, ancak makale bağlantı dizesini gerçekten değiştiren herhangi bir kod göstermiyor.

GÜNCELLEME: Sorumu açıklığa kavuşturmaya yardımcı olacak daha fazla bilgi.
Öncelikle kod kullanmıyorum ve yapılandırma dosyasının dışında bir bağlantı dizesi oluşturmak istiyorum.
Kullanmakta olduğum DbContext, T4 şablonunun oluşturduğu otomatik oluşturulan DbContext dosyasına kısmi bir sınıftır.
Kalıtsal bir DbConfiguration sınıfı oluşturmam gerektiği ve bu sınıfta bir şeyler yapmam gerektiği izlenimindeydim ancak bulduğum tek örnek Azure kullanıyor.

Kod Çalışması'nda, çalışma zamanında bağlantı dizesinin ayarlanmasından söz eden ancak makalenin her yeni bir Varlık kapsayıcısını oluşturduğumda bir bağlantı dizesi oluşturmaya dayalı bir makalesi var.
http://www.codeproject.com/Tips/234677/Set-the-connection-string-for-Entity-Framework-at

arayan özel bir şey yapmak zorunda kalmaması ben bağlantı dizesini oluşturmak için benim kısmi DBContext sınıfını kullanabilmek için istiyorum.

GÜNCELLEME: RunTime kodunu Çalışma ancak, benim varlık sınıfına aramaları değiştirmeden bağlantı dizesini değiştirmek başardı "aşağıda listelenmiştir" @Circular Referans tarafından gönderildi kodu kullanarak
DesignTime AMA bu işe yaramazsa DesignTime EDMX dosyası için.

public partial class TestEntities : DbContext 
{ 
    public TestEntities() : base(GetSqlConnection(), true) 
    { 
    } 

    public static DbConnection GetSqlConnection() 
    { 
     // Initialize the EntityConnectionStringBuilder. 
     EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 

     var connectionSettings = ConfigurationManager.ConnectionStrings("Current_ADO_Connection_In_Config"); 

     // Set the provider name. 
     entityBuilder.Provider = connectionSettings.ProviderName; 

     // Set the provider-specific connection string. 
     entityBuilder.ProviderConnectionString = connectionSettings.ConnectionString; 

     // Set the Metadata location. 
     entityBuilder.Metadata = "res://*/Models.TestModel.csdl|res://*/Models.TestModel.ssdl|res://*/Models.TestModel.msl"; 

     return new EntityConnection(entityBuilder.ToString()); 
    } 
} 

Şimdi DesignTime'ı çalıştırabilirsem, bu iyi olur.

+0

sana ObjectContext inste kullanarak olacağını düşünüyorum İlk önce kod kullanmadığınız için DbContext'in reklamı. Bu ilişkide% 100 emin değilim. Bu, şu ipuçlarına: https://msdn.microsoft.com/en-us/library/bb738461(v=vs.110).aspx ve buradan bağlantı oluşturmayı açıklayan bir bağlantıdır: https://msdn.microsoft.com /en-us/library/bb738533%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396 – AaronLS

+0

CodeFirst için bağlantı dizeleri genellikle standart bağlantı dizeleridir; burada CodeFirst olmayanlar için bağlantı dizeleri genellikle csdl'ye başvururlar. ssdl/msl dosyaları. – AaronLS

cevap

10

ADO.NET bağlantı dizesiyle oluşturulmuş bir DbConnection geçirdiğiniz için Kod İlk modu kural dışı durumunu alıyorsunuz. Bu bağlantı dizesi meta veri dosyalarına başvurular içermez, bu nedenle EntityFramework bunları nerede bulacağını bilmez.

Uygun bir program aracılığıyla ayarlanmış bağlantı dizesiyle DbContext oluşturmak için EntityConnectionStringBuilder sınıfını kullanın.

var entityBuilder = new EntityConnectionStringBuilder(); 

// use your ADO.NET connection string 
entityBuilder.ProviderConnectionString = conString; 

// Set the Metadata location. 
entityBuilder.Metadata = @"res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl"; 
var dbContext = new DbContext(entityBuilder.ConnectionString); 
+0

Cevabınız işe yarıyor, ancak kodda bir Varlık kapsayıcısı oluşturduğumda bunu yapmak zorundayım. Kısmi DbContext çağrılarında bunu yapmanın bir yoluna ihtiyacım var ... ama o zaman bile, tasarımcı için çalışacağından emin değilim. Sanırım DbConfiguration ile bir şeyler yapmak zorundayım ama iyi örnekler bulamıyorum. – goroth

+0

[this] (http://forums.asp.net/t/1747809.aspx?How+to+pass+in+an+entity+framework+connection+string+between+assemblies+) 'ı işaretleyin. Biraz daha fazla kod yazmanız gerekecek ve çalışır durumdayken, sürdürülebilirlik açısından iyi değil. EF bağlantı dizesini yapılandırma dosyasında tutmak daha iyi olabilir. –

+0

İşe yarayabilirsem, bu uygulama ile iyi olurdum. Ancak, yukarıdakiler tarafından oluşturulan DB bağlam veritabanına erişmeye çalışırken "anahtar kelime desteklenmiyor 'meta verileri" hatası alıyorum. –

17

Yapılandırma dosyanızdaki bağlantı dizesini kullanarak tasarım zamanında çalışabilirsiniz.

<add name="DWContext" connectionString="metadata=res://*/Database.DWH.DWModel.csdl|res://*/Database.DWH.DWModel.ssdl|res://*/Database.DWH.DWModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SQLSERVER_INSTANCE;initial catalog=DB_NAME;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

Bu yüzden SADECE tasarım zamanında ihtiyacınız olduğu için onu kaldırmayın. zamanında yerine dinamik bir şekilde

Çalışması (sizin sonuncusu benzer) Bu yaklaşımı kullanarak:

public partial class DWContext 
{ 
    public DWContext(string nameOrConnectionString) 
     : base(nameOrConnectionString) 
    { 
    } 

    /// <summary> 
    /// Create a new EF6 dynamic data context using the specified provider connection string. 
    /// </summary> 
    /// <param name="providerConnectionString">Provider connection string to use. Usually a standart ADO.NET connection string.</param> 
    /// <returns></returns> 
    public static DWContext Create(string providerConnectionString) 
    { 
     var entityBuilder = new EntityConnectionStringBuilder(); 

     // use your ADO.NET connection string 
     entityBuilder.ProviderConnectionString = providerConnectionString; 

     entityBuilder.Provider = "System.Data.SqlClient"; 

     // Set the Metadata location. 
     entityBuilder.Metadata = @"res://*/Database.DWH.DWModel.csdl|res://*/Database.DWH.DWModel.ssdl|res://*/Database.DWH.DWModel.msl"; 

     return new DWContext(entityBuilder.ConnectionString); 
    } 

} 

Ve kodundan

yeni EF veri oluşturmak:

veri bağlam kısmi sınıfını uzatın bağlam ile:

private DWContext db = DWContext.Create(providerConnectionString); 

Ciao ;-)

+0

Tatlı ve basit bir çözüm, teşekkürler :) –

+0

Bu benim için çalışmaz, "Bu içerik Kod İlk modunda kullanılıyor ..." mesajını alıyorum. –

+0

@NilsGuillermin veri modelini yeniden silmeyi ve oluşturmayı deneyin ve "Varolan veritabanından oluştur (Veritabanından önce oluştur") seçeneğini belirlediğinizden emin olun. – jacktric

İlgili konular