实体框架:上下文在 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.config
的connection 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 文件生成的的主要内容,如果未能解决你的问题,请参考以下文章