实体框架:上下文在 Code First 模式下使用,代码是从 EDMX 文件生成的

Posted

技术标签:

【中文标题】实体框架:上下文在 Code First 模式下使用,代码是从 EDMX 文件生成的【英文标题】:Entity Framework: The context is being used in Code First mode with code that was generated from an EDMX file 【发布时间】:2016-09-28 10:41:13 【问题描述】:

我正在使用 EF 6 数据库优先方法开发 WPF 应用程序,我的解决方案中有 1 个项目,如果我运行我的项目,这个错误总是会出现。

上下文在 Code First 模式下使用,代码是从 EDMX 文件生成的,用于 Database First 或 Model First 开发。这将无法正常工作。要解决此问题,请不要删除引发此异常的代码行。如果您希望使用 Database First 或 Model First,请确保 Entity Framework 连接字符串包含在启动项目的 app.config 或 web.config 中。如果要创建自己的 DbConnection,请确保它是 EntityConnection 而不是其他类型的 DbConnection,并将其传递给采用 DbConnection 的基本 DbContext 构造函数之一。要了解有关 Code First、Database First 和 Model First 的更多信息,请参阅此处的实体框架文档:http://go.microsoft.com/fwlink/?LinkId=394715

【问题讨论】:

您是否设置了连接字符串?如果没有看这里:asp.net/mvc/overview/getting-started/introduction/… 【参考方案1】:

我的错误是在构造函数中使用标准连接字符串

(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)

编辑:将代码更改为代码格式,以便于阅读。

【讨论】:

工作正常。拯救我的生命!【参考方案2】:

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" />

【讨论】:

【参考方案3】:

你可以做的一件事是......(如果是数据库优先)

打开.edmx[Diagram] -> 右键 -> “Update Model from database”

并查看是否会出现“添加”、“刷新”和“删除”选项卡。

如果没有...可能您的连接已断开,而 VS 创建新连接字符串的对话框将会出现。 =)

【讨论】:

如果这是设计优先呢? 您在项目中使用 .Edmx 吗?【参考方案4】:

您不应该使用生成的连接字符串,现在您的解决方案中包含了所有元数据文件。而是尝试在app.configconnection string 部分使用:

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

【讨论】:

【参考方案5】:

很晚了,但仍然很有帮助。我陷入了类似的问题。发布了关于 SO 的问题并能够找到解决方案。可以参考Connection String errors in C# Web Api。 我的情况是我在 web.config 中有两个连接字符串(转到链接时你会知道为什么)。评论一个字符串会引发错误,而评论另一个字符串会引发错误,如下所示:

尝试创建类型为“AccountController”的控制器时出错。确保控制器有一个无参数的公共构造函数。

我所做的是:我将我的第一个连接字符串命名为 DefaultConnection,并在 ApplicationDbContext 类构造函数中给出了这个 DefaultConnection。现在我的 AccountController 使用这个连接字符串,所有其他控制器都使用第二个连接字符串。 这解决了我的问题。

【讨论】:

【参考方案6】:

以上解决方案都不适合我。但我确实在这里找到了 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();

【讨论】:

【参考方案7】:

我也遇到了同样的消息,但使用的是 Web MVC 项目。当我尝试从导入的模型自动生成控制器时会触发此消息。似乎它不起作用,因为“这是从 EDMX 文件生成的”。

好消息是,如果我基于“代码优先”而不是“EF 设计器”生成模型,它就可以工作。坏消息是,如果我希望自动生成控制器起作用,我就不能使用 EF 设计器。从这两种方式中生成模型并不重要。生成模型后,您可以以相同的方式使用它。

尝试从项目中删除所有 emdx 对象,并基于 Code First 而不是 EF 设计器重新创建模型。为我工作!

【讨论】:

【参考方案8】:

我有两个项目:

一个用于生成的 EDMX 文件和所有相关模型。

另一个是 ASP.NET MVC Web。

我遇到了这个问题,因为我在 ASP.NET MVC Web 项目上使用的连接字符串是我使用 ADO.NET 连接使用的普通字符串。所以我所做的如下:

在您的 EDMX 项目文件中打开 app.config。

复制其连接字符串。

粘贴到WEB项目上,因为启动时会用到 应用程序。

【讨论】:

以上是关于实体框架:上下文在 Code First 模式下使用,代码是从 EDMX 文件生成的的主要内容,如果未能解决你的问题,请参考以下文章

14.翻译系列:从已经存在的数据库中生成上下文类和实体类EF 6 Code-First系列

ORM框架 EF - code first 的封装

EF之Code First代码优先

实体框架 Code First SQL Server 视图

实体框架 - Code First Bug [关闭]

实体框架-EF Code First Select外键