18

MVC4 + Entity Framework 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; }

}
}

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

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

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

不支持使用相同的 DbCompiledModel 检索 BTD.Data.Product 的元数据以针对不同类型的数据库服务器创建上下文。相反,为正在使用的每种类型的服务器创建一个单独的 DbCompiledModel。

我完全不知所措-我已经用我能想到的上述错误消息的几乎所有不同变体搜索了谷歌,但无济于事。

以下是我可以验证的事情......

  1. MySql 工作正常
  2. 我正在使用 MySql 连接器版本 6.5.4 并创建了其他 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>

我确实已经在这个错误上工作了好几天了——我现在已经到了愿意付钱给别人来解决它的地步……不开玩笑……我真的很喜欢使用 MVC 4 和 Razor——我很高兴能开始做这件事,但现在我很气馁——我真的很感激任何帮助/指导!

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

另一个注意事项

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

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

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

另一个人遇到同样的问题

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

更新

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

其他参考

似乎其他人遇到了与我相同的问题-唯一的区别是他们使用的是 sql server-我尝试调整所有代码以遵循此处有关此 stackoverflow 问题/答案的建议,但仍然无济于事

可能的修复???

所以这很奇怪......在将它连接到MS Sql Server并添加控制器之后,然后将连接字符串恢复到MySql它实际上是在使用MySql......这到底是什么!??

因此,似乎当您尝试添加控制器并添加视图脚手架(是正确的短语吗?)与 mysql 连接字符串一起添加时,它失败了......但是,如果您将它连接到 sql server db,则生成脚手架/controller,然后恢复到 mysql 连接字符串就可以了.... ?!?!

4

6 回答 6

25

似乎 MVC4 控制器脚手架没有正确识别 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>

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

<connectionStrings>
    <add name="BTDContext" connectionString="Data Source=host_name;Database=database_name;uid=user_id;pwd=password;" providerName="MySql.Data.MySqlClient" /> 
</connectionStrings>

注意更改,提供者名称。

于 2012-12-29T12:22:45.837 回答
10

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

[DbConfigurationType(typeof(MySqlEFConfiguration))]

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

于 2014-09-03T09:23:46.340 回答
10

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

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

  1. 临时添加一个带有System.Data.SqlClientas 的连接字符串providerName,并为 MySQL 添加注释。连接字符串是否有效并不重要。
  2. 确保MySqlEFConfiguration未以任何方式启用。
  3. 重建。

关于第二点,关于将 Connector/NET 与 EF6 结合使用的 MySQL 文档说明了启用MySqlEFConfiguration. 确保在使用 VS 模板添加控制器时这些都未启用。

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

[DbConfigurationType(typeof(MySqlEFConfiguration))]

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

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

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

于 2015-04-08T14:42:06.620 回答
1

我也围绕这个错误进行了测试,发现了另一个问题。

以下代码在我的 Web.config 中(没有,它不起作用):

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

将其更改为:

<entityFramework>

对我有用...添加脚手架,然后将其改回

于 2015-11-08T14:03:13.517 回答
0

我在使用 EF 4.3.1 和 MySql Connecter/Net 6.6.4.0 时遇到了同样的问题

这对我有用,无需连接到 Context 类中的不同数据库或额外代码。

当你想构建一个脚手架时,在你的 web.config 文件中的 entityFramework 标签之间添加这个:

<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="Data Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True" />
  </parameters>
</defaultConnectionFactory>

然后在您想要运行迁移时将上述代码注释掉,反之亦然。

所以你的 web.config 看起来像这样:

<entityFramework>
  <contexts>
    <context type="ApptManager.Models.AppointmentsManagerContext, ApptManager">
      <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[ApptManager.Models.AppointmentsManagerContext, ApptManager], [ApptManager.Migrations.Configuration, ApptManager]], EntityFramework" />
    </context>
  </contexts>
  <!--<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="Data Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True" />
    </parameters>
  </defaultConnectionFactory>-->
</entityFramework>

.NET 开发人员必须跳过一些艰巨的障碍才能使他们的代码正常工作,这非常荒谬。

工作示例

https://github.com/dublinan/mvc-mysql-ef-example

链接到我的 github 项目

于 2013-02-05T17:03:35.843 回答
0

请尝试使用

System.ComponentModel.DataAnnotations

命名空间以及 EDM 类成员的 [Key] 属性。

它对我有用。

于 2017-06-15T12:38:53.210 回答