MySQL 具有 EF6 代码优先的现有数据库 - 使用脚手架创建控制器导致错误
MySQL existing DB with EF6 Code First - Controller Creation With Scaffolding Results in Error
注意:我可以手动创建控制器,获取数据,然后转储到我手动创建强类型的视图中,但任何脚手架尝试都会导致这个错误。
注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'
其中 WebApplication1
是我的测试项目的名称。 MySQLModels
是包含 EF Code First 生成的所有模型的 DbContext
文件所在的位置,并且 ***********
替换 table.
的名称
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中对应Table定义
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`);
我无法控制 table 定义,因为这是我正在使用的现有数据库。
重现步骤:
创建一个新的 ASP.NET MVC 5 项目(在我的例子中称为 WebApplication1)
添加 MySQL DLL:MySql.Data、MySql.Data.Entity.EF6、MySQL.Web.
将现有的 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>
重建项目。
创建一个文件夹以导入所有模型并创建 DbContext,
在我的例子中,文件夹是 MySQLModels
向项目添加一个 ADO.NET 实体数据模型。 Select正确的
数据库连接。 Select table 然后单击完成。
重建项目。
右键单击 Controllers 文件夹,然后单击“添加”->“控制器”。在弹出窗口 window select MVC 5 Controller with views, using Entity Framework
中单击添加。
Select 模型之一,select 您的数据上下文 class,输入
适当的控制器名称并单击添加。
按照这个过程你会看到错误。
到目前为止我尝试过的内容:
一般而言,我找不到太多关于此错误的信息,但特别是与 MySQL 有关的内容。
有一个未回答的问题,没有太多详细信息,可以在此处找到:
我尝试了这里的建议:
Unable to Retrieve Metadata
这建议我更改连接字符串中的 providerName
到 System.Data.SqlClient
但这会导致相同的错误。
我卸载并重新安装了 MySQL 中的所有内容,但无济于事。
更新: 为每个 table 添加单独的 ADO.NET 实体数据模型修复了这个问题
错误。这不完全是解决方案,但没有任何其他解决方案
这允许我用一个 Db 上下文创建脚手架,这可能
工作。
更新 2:尝试了 Microsoft 的迁移工具:
http://www.microsoft.com/en-us/download/details.aspx?id=42657。这个
可以用,但是很多数据没有移植过来。再一次,这是
最后的努力仍然不是解决方案。
我会不断更新这个问题以添加更多详细信息,因为我会尝试各种 thingamajigs。
这是旧的,但如果有人试图找到修复,就在这里。
指定数据类型的注释是罪魁祸首。
尝试从模型中删除注释。在这种情况下,下面两个
[列(TypeName = "text")], [列(TypeName = "date")]
然后构建、清理、构建项目
现在添加控制器(脚手架)就像魅力一样。
稍后您可以重新添加相同的内容。
注意:我可以手动创建控制器,获取数据,然后转储到我手动创建强类型的视图中,但任何脚手架尝试都会导致这个错误。
注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'
其中 WebApplication1
是我的测试项目的名称。 MySQLModels
是包含 EF Code First 生成的所有模型的 DbContext
文件所在的位置,并且 ***********
替换 table.
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中对应Table定义
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`);
我无法控制 table 定义,因为这是我正在使用的现有数据库。
重现步骤:
创建一个新的 ASP.NET MVC 5 项目(在我的例子中称为 WebApplication1)
添加 MySQL DLL:MySql.Data、MySql.Data.Entity.EF6、MySQL.Web.
将现有的 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>
重建项目。
创建一个文件夹以导入所有模型并创建 DbContext, 在我的例子中,文件夹是 MySQLModels
向项目添加一个 ADO.NET 实体数据模型。 Select正确的 数据库连接。 Select table 然后单击完成。
重建项目。
右键单击 Controllers 文件夹,然后单击“添加”->“控制器”。在弹出窗口 window select
MVC 5 Controller with views, using Entity Framework
中单击添加。Select 模型之一,select 您的数据上下文 class,输入 适当的控制器名称并单击添加。
按照这个过程你会看到错误。
到目前为止我尝试过的内容:
一般而言,我找不到太多关于此错误的信息,但特别是与 MySQL 有关的内容。
有一个未回答的问题,没有太多详细信息,可以在此处找到:
我尝试了这里的建议: Unable to Retrieve Metadata 这建议我更改连接字符串中的 providerName 到
System.Data.SqlClient
但这会导致相同的错误。我卸载并重新安装了 MySQL 中的所有内容,但无济于事。
更新: 为每个 table 添加单独的 ADO.NET 实体数据模型修复了这个问题 错误。这不完全是解决方案,但没有任何其他解决方案 这允许我用一个 Db 上下文创建脚手架,这可能 工作。
更新 2:尝试了 Microsoft 的迁移工具: http://www.microsoft.com/en-us/download/details.aspx?id=42657。这个 可以用,但是很多数据没有移植过来。再一次,这是 最后的努力仍然不是解决方案。
我会不断更新这个问题以添加更多详细信息,因为我会尝试各种 thingamajigs。
这是旧的,但如果有人试图找到修复,就在这里。
指定数据类型的注释是罪魁祸首。 尝试从模型中删除注释。在这种情况下,下面两个
[列(TypeName = "text")], [列(TypeName = "date")]
然后构建、清理、构建项目 现在添加控制器(脚手架)就像魅力一样。
稍后您可以重新添加相同的内容。