从备用位置获取实体框架连接字符串?

时间:2011-03-07 23:05:31

标签: asp.net entity-framework web-config

如何从自定义配置文件中检索Entity Framework 4连接字符串,而不是web.config?

编辑: 删除默认构造函数生成的代码并在分部类中重新创建它以使用pull in连接字符串是否合理?

我真的希望避免使用包含连接字符串的重载方法更改对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 个答案:

答案 0 :(得分:3)

DataContext有一个构造函数重载,您可以传递一个连接字符串 - 在这种情况下,您可以从任何您喜欢的地方获取该设置。

根据更新后的问题进行修改:

  

我真的想避免改变   所有对EF上下文的引用   一个重载的方法,包括   连接字符串。

问题是由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
  }
}

你看到这变得越来越复杂和脆弱,所以我不建议这样做 - 但你可以。

答案 1 :(得分:2)

不知道这是否是您要求的,但您可以使用connectionStrings元素的“configSource”属性:

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

答案 2 :(得分:0)

您是否能够从此自定义配置文件中读取连接字符串?如果是这样,您可以使用带有ConnectionString的constructor for your DataContext

NorthWindDataContext nwdc = new NorthWindDataContext(alternateConnectionString);

答案 3 :(得分:0)

或许这样的事情?

// 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);

这是解释此问题的post on Microsoft Connect

答案 4 :(得分:0)

您可以使用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());