Entity Framework, несколько EDMX для совместного использования строки подключения - это возможно? - PullRequest
4 голосов
/ 15 ноября 2011

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

Мы используем одну базу данных и должны иметь отдельные файлы edmx с разными именами классов Model и ObjectContext. В результате получается строка со множеством соединений, которые отличаются только частью метаданных.

Пока что я закончил делать это:

Web.config

<connectionStrings configSource="connectionStrings.config"></connectionStrings>

connectionStrings.config

<connectionStrings> 

<add name="Entities" connectionString="metadata=res://*/Entity.Model.csdl|
res://*/Entity.Model.ssdl|res://*/Entity.Model.msl;
provider=CONNECTION STRING DATA GOES HERE"/> 

<add name="TwoEntities" connectionString="metadata=res://*/TwoEntity.TwoModel.csdl|
res://*/TwoEntity.TwoModel.ssdl|res://*/TwoEntity.TwoModel.msl;
provider=EXACTLY THE SAME CONNECTION STRING DATA GOES HERE"/> 

</connectionStrings> 

В моих классах, производных от ObjectContext, у меня есть сгенерированные по умолчанию конструкторы:

public Entities()
            : base("name=Entities", "Entities")
{
}

и

public TwoEntities()
            : base("name=TwoEntities", "TwoEntities")
{
}

Было бы неплохо не иметь две строки подключения в файле .config, а использовать один и тот же тип подключения из этого файла и каким-то образом переопределить его часть метаданных в каждом классе.

Есть предложения, как это сделать?

1 Ответ

4 голосов
/ 15 ноября 2011

Да, это возможно, но вы не можете использовать строку подключения EF из конфигурации.Вы должны построить строку подключения вручную в приложении.ObjectContext поддерживает несколько перегруженных конструкторов.Один из принимает EntityConnection.EntityConnection, в свою очередь, может быть создан из MetadataWorkspace (класс, созданный из файлов метаданных EF) и DbConnection.Вы можете добавить пользовательский метод фабрики в свой производный контекст, который будет строить MetadataWorkspace и DbConnection из строки подключения к общей БД и передавать их в EntityConnection.

public static Entities GetContext(string connenctionString) 
{
    MetadataWorkspace workspace = GetWorkspace(); // This should handle workspace retrieval
    DbConnection connection = new SqlConnection(connectionString); // Connection must not be openned
    EntityConnection entConnection = new EntityConnection(workspace, entConnection);
    return new Entities(entConnection);
}

private Entities(EntityConnextion entConnection) : base(entConnection)
{  } 

Вы будете использовать этот метод фабрики вместоконструктор.Убедитесь, что GetWorkspace создает MetadataWorkspace только один раз для каждого набора метаданных, и сохраните его внутри в течение всего срока службы приложения.Его создание занимает много времени.

...