【问题标题】:Entity Framework: The context is being used in Code First mode with code that was generated from an EDMX file实体框架:上下文在 Code First 模式下使用,代码是从 EDMX 文件生成的
【发布时间】: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

【问题讨论】:

标签: c# .net wpf entity-framework visual-studio


【解决方案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项目上,因为启动时会用到 应用程序。

            【讨论】:

              猜你喜欢
              • 2015-09-25
              • 1970-01-01
              • 1970-01-01
              • 2013-02-16
              • 1970-01-01
              • 1970-01-01
              • 2011-07-10
              • 1970-01-01
              • 2016-05-13
              相关资源
              最近更新 更多