5

Mam wiele baz danych w jednym serwerze SQL. Umieściłem connectionString jako szablon (spójrz na Initial Catalog={0}) na web.config.Jak utworzyć Entity Framework ObjectContext?

<add name="ent" connectionString="metadata=res://*/ent.csdl|res://*/ent.ssdl|res://*/ent.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=1.1.1.1;Initial Catalog={0};Persist Security Info=True;User ID=user;Password=pass;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

Chcę utworzyć objectContext z prawidłowym connectionString. Pomyślałem, aby wykonać następujące czynności, CreatObjectContext<SiteEntities>('MySite'), ale pojawia się błąd Unable to determine the provider name for connection of type 'System.Data.EntityClient.EntityConnection'.

public T CreatObjectContext<T>(string dbName) where T : ObjectContext, new() 
{   
     var conStr = ConfigurationManager.ConnectionStrings["ent"].ConnectionString; 
     var entityBuilder = new EntityConnectionStringBuilder(conStr); 
     entityBuilder.Provider = "System.Data.SqlClient"; 
     // Build correct conString to the db 
     entityBuilder.ProviderConnectionString = string.Format(entityBuilder.ProviderConnectionString, dbName); 

     var connection = new EntityConnection(entityBuilder.ConnectionString);       
     var builder = new ContextBuilder<T>(); 

     return builder.Create(connection);   
} 

Co robię źle? Jak mogę stworzyć kontekst?

Odpowiedz

4

Jeśli korzystasz z EntityConnectionStringBuilder, wystarczy przechowywać ciągi połączeń sqlserver w pliku web.config. EntityConnectionStringBuilder może następnie przekształcić te w ciągi połączeń EF4.

Przykład web.config

<connectionStrings> 
     <add name="db1" connectionString="data source=localhost\SQLEXPRESS;initial catalog=db1;integrated security=True;multipleactiveresultsets=True;App=EntityFramework" /> 
     <add name="db2" connectionString="data source=localhost\SQLEXPRESS;initial catalog=db2;integrated security=True;multipleactiveresultsets=True;App=EntityFramework" /> 
    </connectionStrings> 

I możemy zmienić metodę do czegoś podobnego:

public ObjectContext CreatObjectContext(string dbName) 
{   
     var conStr = ConfigurationManager.ConnectionStrings[dbName].ConnectionString; 
     var entityBuilder = new EntityConnectionStringBuilder(); 

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

     entityBuilder.MetaData = @"res://*/ent.csdl|res://*/ent.ssdl|res://*/ent.msl"; 

     return new ObjectContext(entityBuilder.ToString());   
} 
+0

Powiązane pytanie entity-framework-runtime-connection string http://stackoverflow.com/ pytania/11368897/entity-framework-runtime-connection-string –

2

Chciałem tylko podzielić się małą klasę, aby utworzyć połączenie Entity Framework przy użyciu klasy encji jako typ ciągu połączenia SQL i nazwy meta danych entityModel. Przykładem

public static class EFConnection<T> where T : ObjectContext 
    { 
    public static T GetDatabase(string connectionString,string entityModelMetadataName) 
    { 

     var entityBuilder = new EntityConnectionStringBuilder(); 
     entityBuilder.Provider = "System.Data.SqlClient"; 
     entityBuilder.ProviderConnectionString = connectionString; 
     entityBuilder.Metadata = @"res://*/" + entityModelMetadataName + ".csdl|res://*/" + entityModelMetadataName + ".ssdl|res://*/" + entityModelMetadataName + ".msl"; 


    var _db=(T)Activator.CreateInstance(typeof(T), new object[] { entityBuilder.ToString()}); 
    return _db; 

    } 

} 

zastosowanie:

var _db = EFConnection<Model1Container>.GetDatabase(Settings.General.Default.DatabaseConnectionString, "Model1"); 

ja używaliśmy this słupek również umieścić wszystko razem:

Powiązane problemy