3

目前,我有我的解決方案,一個ASP.NET核心Web應用程序和.NET 4.6.1(非核心)類庫2個項目。在我的類庫中,我添加了Entity Framework 6,並且使用Database First generation創建了所有我的數據庫上下文類。在類庫裏面,一切都按預期工作;但是,當我嘗試從.NET Core Web App訪問ef類時,它沒有可供使用的連接字符串,並且失敗。訪問實體框架類庫從ASP.NET核心Web應用程序

現在,在舊的方式,我知道我可以在連接字符串設置從app.config中在我的類庫複製到Web應用程序的Web.config,但.NET的核心並不支持這一點。

我使用概述here的步驟嘗試,但僅適用於代碼優先分貝代(這我沒有做)。我也考慮切換到使用EntityFrameworkCore,但我不能讓數據庫第一代發生(使用此overview)。

有什麼辦法可以實現我想要做的?

回答

3

下面是如何爲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) 
    { 

    } 
} 
+0

我喜歡這個,因爲它看起來非常簡單...今天會給它一個鏡頭。一個問題,雖然...有什麼辦法把連接字符串放在appsettings.json文件中,這樣我就不必重新編譯來更改連接字符串了? –

+0

好吧,我把它全部連接起來了,它看起來很有希望,但我仍然得到這個錯誤: 附加信息:上下文在代碼優先模式下使用,代碼是從EDMX文件爲數據庫優先或Model First開發。這將無法正常工作。 –

+0

您嘗試從連接字符串中刪除元數據部分嗎? http://stackoverflow.com/questions/7944596/entity-framework-cant-use-the-dbcontext-model-being-created – Sal

1

長話短說:你有你的ConnectionString複製到託管項目的web.config/app.config中。 您的類庫無法運行在控制檯應用程序/ MVC/Web API,沒有這個應用程序之一,它只是一個DLL。 所以總結一下,你需要將所有連接字符串和其他重要的東西複製到主機項目的web.config文件中。

相關問題