Как создать Entity Framework ObjectContext? - PullRequest
5 голосов
/ 01 сентября 2011

У меня много БД на одном SQL-сервере. Я поместил connectionString как шаблон (посмотрите на Initial Catalog={0}) в web.config.

<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" />

Я хочу создать объектContext с правильной строкой соединения. Я думал сделать следующее, CreatObjectContext<SiteEntities>('MySite') но я получаю ошибку 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);           
}

Что я делаю не так? Как я могу создать контекст?

Ответы [ 2 ]

4 голосов
/ 01 сентября 2011

Если вы используете EntityConnectionStringBuilder, вам нужно только сохранить строки подключения sqlserver в вашем файле web.config. EntityConnectionStringBuilder может затем преобразовать их в строки подключения EF4.

Пример 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>

И мы можем изменить ваш метод на что-то вроде:

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());          
}
2 голосов
/ 04 апреля 2013

Я просто хотел поделиться небольшим классом для создания соединения с сущностью, используя класс сущности в качестве типа T строки соединения SQL и имени метаданных entityModel.

    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;

    }

}

пример использования:

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

Я использовал этот пост, чтобы собрать все вместе:

...