Одна строка соединения с несколькими моделями Entity Framework? - PullRequest
8 голосов
/ 25 июня 2010

На работе у нас сейчас очень большое веб-приложение с подключением к огромной базе данных. Мы уже давно используем Entity Framework и, чтобы упростить задачу, мы разделили базу данных на множество моделей Entity. Это хорошо работает для нас, но мы столкнулись с проблемой. Каждая модель EF нуждается в собственной строке подключения из-за части метаданных строки подключения. Управление таким количеством строк подключения - это боль.

Теперь у меня есть решение, которое, я думаю, будет работать. Я собираюсь создать класс, в котором информация метаданных будет сохранена как свойство, также объединенное со стандартной строкой соединения в файле web.config. Поэтому, когда мы используем строку подключения «Database.EntityConnectionString», она выдаст мне строку «Entity Connection», но нам нужно будет управлять только одной строкой подключения в файле web.config. Нам по-прежнему придется управлять классом с помощью метаданных, но модели не сильно меняются, и мы не создаем их часто, поэтому обслуживание должно быть в порядке. Мой вопрос, есть ли лучший способ решения этой проблемы или как бы вы это сделали?

Спасибо!

Ответы [ 3 ]

7 голосов
/ 25 июня 2010

Вот как я реализовал свое решение этой проблемы:

namespace DBLibrary
{
    public enum Models
    {
        Model1,
        Model2    
    }

    public static class Database
    {
        public static string EntitiesConnectionString(Models model)
        {
            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["Default"].ConnectionString);

            builder["MultipleActiveResultSets"] = true;
            builder["Connect Timeout"] = 30;

            EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
            entityBuilder.Provider = "System.Data.SqlClient";
            entityBuilder.ProviderConnectionString = builder.ConnectionString;

            switch (model)
            {
                case Models.Model1:
                    entityBuilder.Metadata = "res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl";
                    return entityBuilder.ToString();
                case Models.Model2:
                    entityBuilder.Metadata = "res://*/Model2.csdl|res://*/Model2.ssdl|res://*/Model2.msl";
                    return entityBuilder.ToString();
                default:
                    throw new Exception("Invalid model, no connection string defined");
            }
        }
    }
}

Мне все еще нужно очистить код и все, но я думаю, что это даст вам хорошее представление о том, как это можно реализовать.Мне все равно было бы очень интересно, есть ли другие и лучшие способы сделать это.

Спасибо!

1 голос
/ 26 августа 2013

Добавить конструкцию по умолчанию в вашем классе

public class ItemContext : DbContext
{
    public DbSet<Item>Items get; set; }
    public DbSet<ItemDetail> ItemDetails { get; set; }

    public ItemContext ()
    {

        this.Database.Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
    }
}
0 голосов
/ 19 февраля 2013

У меня была такая же проблема. Я решил это следующим образом:

Я создал два файла edmx, но при создании второго файла edmx я проигнорировал строку подключения, которую нужно сохранить в файле конфигурации. Таким образом, мой файл конфигурации будет содержать только одну строку подключения. Затем я изменил следующие строки в строке подключения:

<add name="MyDbContext" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string=&quot;data source=abc;initial catalog=mydb;persist security info=True;user id=myuser;password=password;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Просто замените "res: //model1.csdl" на "res: // * /" , и это работает как чудо

Вы можете указать это имя соединения в конструкторе вашего класса dbcontext, например:

public MyDbContext() : base("name=NameOfYourConnectionString") //  Name of your connection string
{ }

Примечание. Я использую Entity Framework 5.0.

...