簡體   English   中英

實體框架:上下文在代碼優先模式下使用,代碼是從 EDMX 文件生成的

[英]Entity Framework: The context is being used in Code First mode with code that was generated from an EDMX file

我正在使用 EF 6 數據庫第一種方法開發 WPF 應用程序,我的解決方案中有 1 個項目,如果我運行我的項目,這個錯誤總是出現。

上下文在代碼優先模式下使用,代碼是從 EDMX 文件生成的,用於數據庫優先或模型優先開發。 這將無法正常工作。 要解決此問題,請不要刪除引發此異常的代碼行。 如果您希望使用 Database First 或 Model First,請確保實體框架連接字符串包含在啟動項目的 app.config 或 web.config 中。 如果您要創建自己的 DbConnection,請確保它是 EntityConnection 而不是某種其他類型的 DbConnection,並且將其傳遞給采用 DbConnection 的基本 DbContext 構造函數之一。 要了解有關代碼優先、數據庫優先和模型優先的更多信息,請參閱此處的實體框架文檔: http : //go.microsoft.com/fwlink/?LinkId=394715

我的錯誤是在構造函數中使用標准連接字符串

Server = test\\test; Database = DB; User Id = test_user;Password = test ),

但實體框架需要不同的格式

( metadata=res://*/DBModel.csdl|res://*/DBModel.ssdl|res://*/DBModel.msl;provider=System.Data.SqlClient;provider connection string="data source=test\\test;initial catalog=DB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework""" providerName = ""System.Data.EntityClient )

編輯:將代碼更改為代碼格式,以便於閱讀。

EF 根據連接字符串中元數據部分的存在與否做出假設。 如果您收到此錯誤,您可以將元數據部分添加到配置文件中的連接字符串中。

例如,如果您的連接字符串如下所示:

    <add name="MyModel" connectionString="data source=SERVER\INSTANCE;initial catalog=MyModel;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

前置metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl; 所以它看起來像這樣:

<add name="MyModel" connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;data source=SERVER\INSTANCE;initial catalog=MyModel;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

你可以做的一件事是......(如果是數據庫優先)

打開 .edmx[Diagram] -> 右鍵單擊​​ -> “從數據庫更新模型”

並查看是否會出現“添加”、“刷新”和“刪除”選項卡。

如果沒有...可能您的連接已斷開,並且會出現 VS 創建新連接字符串的對話框。 =)

您不應該使用生成的連接字符串,現在您的解決方案中包含所有元數據文件。 而是嘗試在app.config connection string部分使用:

"data source=localhost\sqlexpress; initial catalog=sample; integrated security=True;MultipleActiveResultSets=True;"

很晚了,但仍然有幫助。 我陷入了類似的問題。 在 SO 上發布了一個問題,並找到了解決方案。 您可以參考C# Web Api 中的連接字符串錯誤 我的情況是我在 web.config 中有兩個連接字符串(您會在轉到鏈接時知道原因)。 評論一個字符串會引發您遇到的錯誤,而評論另一個字符串則會引發錯誤,如下所示:

嘗試創建類型為“AccountController”的控制器時發生錯誤。 確保控制器具有無參數的公共構造函數。

我所做的是:我將我的第一個連接字符串命名為 DefaultConnection,並在 ApplicationDbContext 類構造函數中給了這個 DefaultConnection。 現在我的 AccountController 使用此連接字符串,所有其他控制器使用第二個連接字符串。 這解決了我的問題。

以上解決方案都不適合我。 但我確實在這里找到了 SqlConnectionBuilder 類,它確實有效: https ://docs.microsoft.com/en-us/dotnet/api/system.data.entityclient.entityconnectionstringbuilder?view=netframework-4.8

它與將字符串指定為此處的其他一些建議相同,但它會為您構建字符串。

// Specify the provider name, server and database.
string providerName = "System.Data.SqlClient";
string serverName = ".";
string databaseName = "AdventureWorks";

// Initialize the connection string builder for the
// underlying provider.
SqlConnectionStringBuilder sqlBuilder =
new SqlConnectionStringBuilder();

// Set the properties for the data source.
sqlBuilder.DataSource = serverName;
sqlBuilder.InitialCatalog = databaseName;
sqlBuilder.IntegratedSecurity = true;

// Build the SqlConnection connection string.
string providerString = sqlBuilder.ToString();

// Initialize the EntityConnectionStringBuilder.
EntityConnectionStringBuilder entityBuilder =
new EntityConnectionStringBuilder();

//Set the provider name.
entityBuilder.Provider = providerName;

// Set the provider-specific connection string.
entityBuilder.ProviderConnectionString = providerString;

// Set the Metadata location.
entityBuilder.Metadata = @"res://*/AdventureWorksModel.csdl|
                        res://*/AdventureWorksModel.ssdl|
                        res://*/AdventureWorksModel.msl";
Console.WriteLine(entityBuilder.ToString());

using (EntityConnection conn =
new EntityConnection(entityBuilder.ToString()))
{
  conn.Open();
  Console.WriteLine("Just testing the connection.");
  conn.Close();
}

我也遇到了這個完全相同的消息,但是使用了一個 web MVC 項目。 當我嘗試從導入的模型自動生成控制器時會觸發此消息。 它似乎不起作用,因為“這是從 EDMX 文件生成的”。

好消息是,如果我基於“Code First”而不是“EF Designer”生成模型,它就可以工作。 壞消息是,如果我想讓自動控制器生成工作,我就不能使用 EF 設計器。 從這兩種方式生成模型中的哪一種都無關緊要。 模型生成后,您可以以相同的方式使用它。

嘗試從項目中刪除所有 emdx 對象,並基於 Code First 而不是 EF Designer 重新創建模型。 為我工作!

我有兩個項目:

一種用於生成的 EDMX 文件和所有相關模型。

另一個是 ASP.NET MVC Web。

我遇到了這個問題,因為我在 ASP.NET MVC Web 項目上使用的連接字符串是我使用 ADO.NET 連接使用的普通字符串。 所以我所做的是以下內容:

  • 打開 EDMX 項目文件上的 app.config。

  • 復制其連接字符串。

  • 將其粘貼到 WEB 項目上,因為這將在您啟動應用程序時使用。

將metadata =“res:// /MyModel.csdl|res:// /MyModel.ssdl|res://*/MyModel.msl”添加到connectionstring和providerName =“System.Data.EntityClient”將解決問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM