下面是如何爲EF車型提供代碼庫的整體配置,以及如何在運行時提供連接字符串。我最近也遇到過這個問題,因爲有關這方面的文檔有點難以找到。
讓我們假設你從你的數據庫(DB-前)生成的模型: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")
而在您的p roject你會碰到這樣的:
<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);
它實際上說,你可以直接通過連接字符串到它。
因此,所有你需要做的是擴展這個部分類,並添加另一個構造函數,一個ConnectionString的。
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)
{
}
}
來源
2016-06-18 12:45:28
Sal
我喜歡這個,因爲它看起來非常簡單...今天會給它一個鏡頭。一個問題,雖然...有什麼辦法把連接字符串放在appsettings.json文件中,這樣我就不必重新編譯來更改連接字符串了? –
好吧,我把它全部連接起來了,它看起來很有希望,但我仍然得到這個錯誤: 附加信息:上下文在代碼優先模式下使用,代碼是從EDMX文件爲數據庫優先或Model First開發。這將無法正常工作。 –
您嘗試從連接字符串中刪除元數據部分嗎? http://stackoverflow.com/questions/7944596/entity-framework-cant-use-the-dbcontext-model-being-created – Sal