使用 EF6 Code First 的 MySQL 现有数据库 - 使用脚手架创建 Controller 导致错误

标签 mysql asp.net-mvc ef-code-first entity-framework-6

注意:我可以手动创建 Controller 、获取数据,然后转储到我手动创建强类型的 View 中,但任何脚手架尝试都会导致这个错误。

注意 2:我使用的是 Visual Studio Professional 2013 Update 4

错误是:

There was an error running the selected code generator: 'Unable to retrieve metadata for 'WebApplication1.MySQLModels.***********. Sequence contains no matching element'

enter image description here

在哪里WebApplication1是我的测试项目的名称。 MySQLModels DbContext 在哪里包含 EF Code First 生成的所有模型的文件是 ***********替换表的名称。

Web.config 自动生成的连接字符串(已替换敏感值):

<add name="stringname" connectionString="server=server;user id=userid;password=password;persistsecurityinfo=True;database=database" providerName="MySql.Data.MySqlClient" />

导致错误的模型类之一:

namespace WebApplication1.MySQLModels
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;

    [Table("database.SomeTable")]
    public partial class SomeTable
    {
        public int id { get; set; }

        [StringLength(255)]
        public string CM { get; set; }

        [StringLength(255)]
        public string Job { get; set; }

        [StringLength(255)]
        public string ClientJobNo { get; set; }

        [StringLength(255)]
        public string JobNo { get; set; }

        [StringLength(255)]
        public string Client { get; set; }

        [Column(TypeName = "date")]
        public DateTime? Start { get; set; }

        [Column(TypeName = "date")]
        public DateTime? Finish { get; set; }

        [StringLength(255)]
        public string Frequency { get; set; }

        [StringLength(255)]
        public string PONumber { get; set; }

        [Column(TypeName = "date")]
        public DateTime? AuditCompleted { get; set; }

        [Column(TypeName = "date")]
        public DateTime? Invoiced { get; set; }

        public decimal? InvoiceAmount { get; set; }

        [StringLength(255)]
        public string Query { get; set; }

        [StringLength(255)]
        public string Status { get; set; }

        [StringLength(255)]
        public string Type { get; set; }

        [StringLength(255)]
        public string Area { get; set; }

        [Column(TypeName = "date")]
        public DateTime? PlannedAudit { get; set; }

        [StringLength(255)]
        public string YellowJacketRequired { get; set; }

        [StringLength(255)]
        public string YellowJacketCompleted { get; set; }

        [StringLength(255)]
        public string SuperName { get; set; }

        [StringLength(255)]
        public string SuperPhone { get; set; }

        [StringLength(255)]
        public string ReasonsDateChange { get; set; }

        [Column(TypeName = "text")]
        [StringLength(65535)]
        public string Comments { get; set; }
    }
}

DB中对应的表定义

CREATE TABLE IF NOT EXISTS `SomeTable` (
`id` int(11) NOT NULL,
  `CM` varchar(255) DEFAULT NULL,
  `Job` varchar(255) DEFAULT NULL,
  `ClientJobNo` varchar(255) DEFAULT NULL,
  `JobNo` varchar(255) DEFAULT NULL,
  `Client` varchar(255) DEFAULT NULL,
  `Start` date DEFAULT NULL,
  `Finish` date DEFAULT NULL,
  `Frequency` varchar(255) DEFAULT NULL,
  `PONumber` varchar(255) DEFAULT NULL,
  `AuditCompleted` date DEFAULT NULL,
  `Invoiced` date DEFAULT NULL,
  `InvoiceAmount` decimal(7,2) DEFAULT NULL,
  `Query` varchar(255) DEFAULT NULL,
  `Status` varchar(255) DEFAULT NULL,
  `Type` varchar(255) DEFAULT NULL,
  `Area` varchar(255) DEFAULT NULL,
  `PlannedAudit` date DEFAULT NULL,
  `YellowJacketRequired` varchar(255) DEFAULT NULL,
  `YellowJacketCompleted` varchar(255) DEFAULT NULL,
  `SuperName` varchar(255) DEFAULT NULL,
  `SuperPhone` varchar(255) DEFAULT NULL,
  `ReasonsDateChange` varchar(255) DEFAULT NULL,
  `Comments` text
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;

ALTER TABLE `SomeTable`
 ADD PRIMARY KEY (`id`);

我对表定义没有太多控制权,因为这是我正在使用的现有数据库。

重现步骤:

  1. 创建一个新的 ASP.NET MVC 5 项目(在我的例子中称为 WebApplication1)

  2. 添加 MySQL DLL:MySql.Data、MySql.Data.Entity.EF6、MySQL.Web。

  3. 将现有的 EntityFramework 标记(在 Web.Config 中)替换为 以下:

    <entityFramework> <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" /> <providers> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" /> </providers> </entityFramework>

  4. 重建项目。

  5. 创建一个文件夹以导入所有模型并创建 DbContext, 在我的例子中,文件夹是 MySQLModels

  6. 将 ADO.NET 实体数据模型添加到项目中。选择正确的 数据库连接。选择表并单击完成。

  7. 重建项目。

  8. 右键单击 Controllers 文件夹,然后单击“添加”->“ Controller ”。在弹出窗口中选择 MVC 5 Controller with views, using Entity Framework然后点击添加。

  9. 选择其中一个模型,选择您的数据上下文类,输入 适当的 Controller 名称并单击添加。

  10. 按照此过程,您将看到错误。

到目前为止我尝试了什么:

一般而言,我找不到太多与此错误相关的信息,但特别是与 MySQL 有关的信息。

有一个未回答的问题,没有很多细节,可以在这里找到:https://stackoverflow.com/questions/24471557/ef6-code-first-existing-mysql-database-scaffolding-errors

  1. 我尝试了这里的建议: Unable to Retrieve Metadata 这建议我更改连接字符串中的 providerName 至 System.Data.SqlClient但这会导致相同的错误。

  2. 我卸载并重新安装了 MySQL 中的所有内容,但无济于事。

  3. 更新:为每个表添加单独的 ADO.NET 实体数据模型可以解决此问题 错误。这不完全是解决方案,但没有任何其他解决方案 这允许我用一个 Db 上下文创建脚手架,这可能 工作。

  4. 更新 2:试用了 Microsoft 的迁移工具: http://www.microsoft.com/en-us/download/details.aspx?id=42657 .这 可以用,但是很多数据没有移植过来。再一次,这是 最后的努力仍然不是解决方案。

在尝试各种 thingamajigs 时,我会不断更新此问题以添加更多详细信息。

最佳答案

这是旧的,但如果有人试图找到修复,就在这里。

指定数据类型的注释是罪魁祸首。 尝试从模型中删除注释。在这种情况下有两个

[列(TypeName = "文本")], [列(TypeName = "日期")]

然后构建、清理、构建项目 现在添加 Controller (脚手架)就像魅力一样。

稍后您可以重新添加相同的内容。

关于使用 EF6 Code First 的 MySQL 现有数据库 - 使用脚手架创建 Controller 导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28900325/

相关文章:

mysql - SQL-从表中获取在两列中共享一个值的所有记录

mysql - CDT 在 MySQL 时区中不存在

c# - ASP.NET MVC 如何使用 javascript 更改更少的变量?

asp.net-mvc - 从 ASP.net MVC 中的授权中排除某些操作

vb.net - 每个层次结构组的 Entity Framework 4.2 表(按鉴别器)

java - 如何使用java获取数据库状态?

python - execute(sql) 后调用fetchall() 是不是第二次读取数据?

c# - 我想获取 ASP.NET MVC 中的部分 url

c# - Entity Framework Core 添加迁移给出的值不能为空。 (参数 'connectionString')

entity-framework - 代码优先 EF6 SqlServerMigrationSqlGenerator 中的自定义逻辑不起作用