无法检索元数据

998*_*823 18 mysql asp.net asp.net-mvc entity-framework ef-code-first

MVC4 +实体框架4.4 + MySql + POCO /代码优先

我正在设置上面的配置..这是我的课程:

namespace BTD.DataContext
{
public class BTDContext : DbContext
{

    public BTDContext()
        : base("name=BTDContext")
    {

    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        //modelBuilder.Conventions.Remove<System.Data.Entity.Infrastructure.IncludeMetadataConvention>();
    }

    public DbSet<Product> Products { get; set; }

    public DbSet<ProductImage> ProductImages { get; set; }        


}
}

namespace BTD.Data
{
[Table("Product")]
public class Product
{
    [Key]
    public long ProductId { get; set; }

    [DisplayName("Manufacturer")]
    public int? ManufacturerId { get; set; }

    [Required]
    [StringLength(150)]
    public string Name { get; set; }

    [Required]
    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    [Required]
    [StringLength(120)]
    public string URL { get; set; }

    [Required]
    [StringLength(75)]
    [DisplayName("Meta Title")]
    public string MetaTitle { get; set; }

    [DataType(DataType.MultilineText)]
    [DisplayName("Meta Description")]
    public string MetaDescription { get; set; }

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

    [DisplayName("Create Date/Time")]
    public DateTime CreateDateTime { get; set; }

    [DisplayName("Edit Date/Time")]
    public DateTime EditDateTime { get; set; }
}

[Table("ProductImage")]
public class ProductImage
{
    [Key]
    public long ProductImageId { get; set; }

    public long ProductId { get; set; }

    public long? ProductVariantId { get; set; }

    [Required]
    public byte[] Image { get; set; }

    public bool PrimaryImage { get; set; }

    public DateTime CreateDateTime { get; set; }

    public DateTime EditDateTime { get; set; }

}
}
Run Code Online (Sandbox Code Playgroud)

这是我的web.config设置......

<connectionStrings>
<add name="BTDContext" connectionString="Server=localhost;Port=3306;Database=btd;User Id=root;Password=mypassword;" providerName="MySql.Data.MySqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
  1. 数据库AND表已经存在......
  2. 我对mvc还很新,但是正在使用本教程

应用程序构建正常...但是当我尝试使用Product(BTD.Data)作为我的模型类和BTDContext(BTD.DataContext)作为我的数据上下文类添加控制器时,我收到以下错误:

无法使用相同的DbCompiledModel检索BTD.Data.Product的元数据,以便针对不同类型的数据库服务器创建上下文.而是为每种使用的服务器创建一个单独的DbCompiledModel.

我完全失去了 - 我已经在谷歌上搜索了几乎我所能想到的错误信息的几乎所有不同变体,但无济于事.

以下是我可以验证的内容......

  1. MySql工作正常
  2. 我正在使用MySql Connector版本6.5.4,并创建了其他具有ZERO问题的ASP.net Web表单+实体框架应用程序

我也试过在我的web.config中包含/删除它:

<system.data>
<DbProviderFactories>
  <remove invariant="MySql.Data.MySqlClient"/>
  <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
Run Code Online (Sandbox Code Playgroud)

几天来我一直在研究这个bug - 我现在已经到了我愿意付钱给别人解决它的问题......不是开玩笑......我真的很喜欢用MVC 4和Razor - 我很高兴开始这个,但现在我非常沮丧 - 我真的很感激任何帮助/指导!

另请注意 - 我正在使用Nuget的Entityframework ...

另一个说明

我正在使用默认的visual studio模板,该模板使用帐户页面和其他内容创建MVC项目.我刚刚删除了对添加文件的所有引用,因为他们试图使用不存在的"DefaultConnection" - 所以我认为这些文件可能是导致错误的原因 - 但是在删除它们之后仍然没有运气 -

我只是想让每个人都知道我正在使用Visual Studio MVC项目模板,它预先创建了一堆文件.我将尝试从没有这些文件的空白MVC项目中重新创建这一切 - 我将在测试后更新此项

更新使用VS MVC基本模板:导致相同的错误 - 仍然没有解决方案

另一个人遇到同样的问题

这里是另一个模仿我的stackoverflow问题 - 但是我尝试了他的解决方案无济于事 - 也许有其他人遇到同样的问题可以从链接中受益

UPDATE

我最近刚尝试将其放入MS Sql Server并且视图脚手架添加正常而没有错误 - 所以我不确定它是我的MySql数据库还是连接字符串或者是什么......让我疯狂......

其他参考文献

看来别人有同样的问题我 - 唯一的区别是他们正在使用sql服务器 - 我试过调整我的所有代码,以遵循这个stackoverflow问题/答案的建议,但仍无济于事

可能的修复???

所以这很奇怪...在将它连接到MS Sql Server并添加控制器之后,然后将连接字符串恢复为MySql它实际上正在使用MySql ......真是太棒了!

所以当你尝试添加你的控制器和视图脚手架(是正确的短语吗?)与mysql连接字符串一起添加它似乎失败了...但是如果你把它连接到一个sql server db,生成脚手架/ controller,然后恢复到mysql连接字符串它的工作....?!?!

ime*_*esh 24

似乎MVC4 Controller脚手架没有正确识别MySql连接字符串.为控制器生成EF CRUD代码时,如下所示更改连接字符串:

<connectionStrings>
    <add name="BTDContext" connectionString="Data Source=host_name;Database=database_name;uid=user_id;pwd=password;" providerName="System.Data.SqlClient" /> 
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

运行应用程序时将其更改回标准:

<connectionStrings>
    <add name="BTDContext" connectionString="Data Source=host_name;Database=database_name;uid=user_id;pwd=password;" providerName="MySql.Data.MySqlClient" /> 
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

请注意更改,提供商名称.


小智 10

imesh暗示几乎解决了我的问题,但另外我临时评论了一行

[DbConfigurationType(typeof(MySqlEFConfiguration))]
Run Code Online (Sandbox Code Playgroud)

这是在DBContext类中.当然,在创建控制器之后,该行应该被取消注释,并在配置文件中将System.Data.SqlClient更改回MySql.Data.MySqlClient.


Aro*_*ers 9

使用VS 2013,MySQL Connector/NET 6.9.6,Entity Framework 6,Web API 2.2和MySQL服务器5.7我必须结合答案以防止出现"无法检索元数据"的错误.

要成功将控制器添加到使用MySQL连接的.NET项目,请执行以下操作:

  1. 暂时添加一个连接字符串System.Data.SqlClient作为providerName,并为MySQL注释一个.连接字符串是否有效无关紧要.
  2. 确保MySqlEFConfiguration未以任何方式启用.
  3. 重建.

关于第二点,关于使用带有EF6的Connector/NETMySQL文档说明了启用它的三种可能方法MySqlEFConfiguration.确保在使用VS模板添加控制器时未启用这些功能.

  1. 在上下文类中添加DbConfigurationTypeAttribute:

[DbConfigurationType(typeof(MySqlEFConfiguration))]

  1. 在应用程序启动时调用DbConfiguration.SetConfiguration(new MySqlEFConfiguration())

  2. 在配置文件中设置DbConfiguration类型:

<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">