以下是如何在代码库中为 EF 模型提供整个配置,以及如何在运行时提供连接字符串。我最近也在为此苦苦挣扎,因为这方面的文档有点难找。
假设您从数据库生成模型(DB-First):MyEntities.edmx
您的项目中将有一个部分类,例如:
public partial class MyEntities : DbContext
{
public MyEntities ()
: base("name=MyEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<MyTable> MyTable { get; set; }
}
当您在 VS 中生成模型时,如果您选择将连接字符串存储在配置文件中,自动代码生成会将连接字符串配置名称放入构造函数中,如上:public MyEntities(): base("name=MyEntities")
在您的项目配置中,您将拥有如下内容:
<configuration>
<connectionStrings>
<add name="MyEntities" connectionString="metadata=res://MyProject/MyEntities.csdl|res://MyProject/MyEntities.ssdl|res://MyProject/MyExchangeEntities.msl;provider=System.Data.SqlClient;provider connection string='data source=SERVERADDRESS;initial catalog=DATABASENAME;persist security info=True;user id=USERID;password=PASSWORD;MultipleActiveResultSets=True;App=EntityFramework'" />
</connectionStrings>
</configuration>
现在绕过这个,如果你看一下 DbContext 构造函数:public DbContext(string nameOrConnectionString); 它实际上说你可以将连接字符串直接传递给它。
所以你需要做的就是扩展这个部分类并添加另一个接受连接字符串的构造函数。
public partial class MyEntities
{
/// <summary>
/// This constructor allows us to pass connection strings at runtime
/// </summary>
/// <param name="connectionString">Entity Framework connection string</param>
public MyEntities(string connectionString) : base(connectionString)
{
}
}
尽管这很明显,但我只想提一下,我们扩展了部分类,而不是修改自动生成的类,因此当我们将来重新生成模型时它不会被覆盖。
要使用连接字符串进行连接,您只需像这样构造对象:new MyEntities("metadata=res://MyProject/MyEntities.csdl|res://MyProject/MyEntities.ssdl|res://MyProject/MyExchangeEntities.msl;provider=System.Data.SqlClient;provider connection string='data source=SERVERADDRESS;initial catalog=DATABASENAME;persist security info=True;user id=USERID;password=PASSWORD;MultipleActiveResultSets=True;App=EntityFramework'");
最后,如果您也想在代码库中提供 EF 配置,可以这样做:
/// DbConfiguration belongs to System.Data
public class EntityFrameworkConfig : DbConfiguration
{
public EntityFrameworkConfig()
{
//We set configurations for entity framework here so that we don't have to add it in the app.config
this.SetDefaultConnectionFactory(new SqlConnectionFactory());
this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
}
}
/// <summary>
/// This class with the DbConfigurationType attribute allows EntityFramework to know
/// to get its config from the EntityFrameworkConfig class instead of the app.config
/// </summary>
[DbConfigurationType(typeof(EntityFrameworkConfig))]
public partial class MyEntities
{
/// <summary>
/// This constructor allows us to pass connection strings at runtime
/// </summary>
/// <param name="connectionString">Entity Framework connection string</param>
public MyEntities(string connectionString) : base(connectionString)
{
}
}