Получить строку подключения Entity Framework из альтернативного местоположения? - PullRequest
2 голосов
/ 08 марта 2011

Как я могу получить строку подключения Entity Framework 4 из пользовательского файла конфигурации, а не web.config?

Редактировать: Разумно ли удалять код, сгенерированный конструктором по умолчанию, и воссоздать его в частичном классе, чтобыиспользовать выдвинутую строку подключения?

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

@ BrokenGlass: Это то, что мы закончилис:

public partial class STARSEntities
{
    private const string _connectionStringFormat = @"metadata=res://*/STARS.EntityModel.STARSModel.csdl|res://*/STARS.EntityModel.STARSModel.ssdl|res://*/STARS.EntityModel.STARSModel.msl;provider=System.Data.SqlClient;provider connection string='Data Source={0};MultipleActiveResultSets=True'";

    /// <summary>
    /// Initializes a new STARSEntities object using the connection string found in the STARS.xml configuration file.
    /// </summary>
    /// <remarks>
    /// If the STARSEntities class is regenerated from the database, the default constructor needs to be removed from the generated file.
    /// </remarks>
    public STARSEntities() : base(GetConnectionString(), "STARSEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    private static string GetConnectionString()
    {
        return string.Format(_connectionStringFormat, ApplicationConfiguration.GetConnectionString("STARS"));
    }

}

Ответы [ 5 ]

3 голосов
/ 08 марта 2011

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

Редактировать на основе обновленного вопроса:

Я бы очень хотел избежать изменения все ссылки на контекст EF с перегруженный метод, включая Строка подключения.

Проблема в том, что контекст Entities, созданный сценарием T4, генерирует свойство const, которое используется в качестве строки подключения

    public const string ConnectionString = "name=FooEntities";

    public FooEntities()
        : base(ConnectionString, ContainerName)
    {
        this.ContextOptions.LazyLoadingEnabled = true;
    }

Поскольку вы не можете переопределить конструктор по умолчанию для частичного класса, единственным вариантом будет изменить сам скрипт T4 - вы должны увидеть следующее в вашем файле скрипта .TT:

    public <#=code.Escape(container)#>()
        : base(ConnectionString, ContainerName)
    {
<#
        WriteLazyLoadingEnabled(container);
#>
    }

Чтобы принудительно использовать строку подключения, вы можете изменить вызов конструктора, чтобы определить строку подключения, вызвав статический метод, который вы определяете в отдельном файле (но для того же частичного класса FooEntities):

    public <#=code.Escape(container)#>()
        : base(GetCustomConnectionString(), ContainerName)
    {
<#
        WriteLazyLoadingEnabled(container);
#>
    }

Теперь GetCustomConnectionString() можно определить отдельно

public partial class FooEntities : ObjectContext
{
   public static string GetCustomConnectionString()
  {
     return "Foobar"; //however you want to determine connection string here
  }
}

Вы видите, что это становится сложным и хрупким очень быстро, поэтому я бы не советовал делать это - но вы могли бы.

2 голосов
/ 08 марта 2011

Не знаю, если это то, что вы просите, но вы можете использовать атрибут "configSource" элемента connectionStrings:

<connectionStrings configSource="connection.config">
</connectionStrings>
0 голосов
/ 21 июля 2012

Вы можете использовать EntityConnectionStringBuilder:

var ecb = new EntityConnectionStringBuilder();
ecb.Metadata = "res://*/Model.MyModel.csdl|res://*/Model.MyModel.ssdl|res://*/Model.MyModel.msl";
ecb.Provider = "System.Data.SqlClient";
ecb.ProviderConnectionString = connectionStringFromFancySource;
return new MyModel(ecb.ToString());
0 голосов
/ 08 марта 2011

Возможно, что-то подобное?

// replace the following line with any business logic you need to get to the file
// with your connection string. If it is a config-style file, you can use the 
// Frameworks's helper classes as well
string connectionString= File.ReadAllText("alternative path");
Entities ent = new Entity(connectionString);

Вот сообщение в Microsoft Connect , которое объясняет это.

0 голосов
/ 08 марта 2011

Можете ли вы прочитать строку подключения из этого файла конфигурации?если это так, вы можете использовать конструктор для вашего DataContext , который принимает ConnectionString.

NorthWindDataContext nwdc = new NorthWindDataContext(alternateConnectionString);
...