MVC3 代码优先 - EF4.1 不会自动创建表(使用 MySQL 和 Connector/Net 6.3.6。)

Posted

技术标签:

【中文标题】MVC3 代码优先 - EF4.1 不会自动创建表(使用 MySQL 和 Connector/Net 6.3.6。)【英文标题】:MVC3 code-first- EF4.1 doesn't create tables automatically (using MySQL and Connector/Net 6.3.6.) 【发布时间】:2011-06-13 11:54:35 【问题描述】:

EF 4.1 连同 mysql 和 Connector/Net 6.3.6 不会根据我的 POCO 对象自动创建表。我不确定我的配置是否错误,或者 Connector/.Net 6.3.6 是否根本不支持此功能。我已经在互联网上爬了一个星期没有找到答案,我相信我已经在 *** 上解决了所有 EF 和 MySQL 问题。我注意到很多帖子都提到了 dotConnect(例如Problems using EF4.1 Code First with MVC3 and MySQL),但我需要找到一个免费的解决方案。我已经设置了表单身份验证,这适用于 MySQL 提供程序,但我必须手动创建数据库架构和表。

我已按以下方式设置我的项目。我的 web.config 文件的一部分。

<connectionStrings>
    <add name="MySQLConn" connectionString="Server=localhost;Database=XxX;Uid=xXx;Pwd=xXx;" providerName="MySql.Data.MySqlClient" />
</connectionStrings>

    <profile defaultProvider="MySqlProfileProvider" enabled="true">
        <providers>
            <clear />
            <add name="MySqlProfileProvider" type="MySql.Web.Profile.MySQLProfileProvider,MySql.Web,Version=6.3.6.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d" connectionStringName="MySQLConn" applicationName="/" />
        </providers>
    </profile>

    <roleManager enabled="true" defaultProvider="MySqlRoleProvider">
        <providers>
            <clear />
            <add name="MySqlRoleProvider" type="MySql.Web.Security.MySQLRoleProvider,MySql.Web,Version=6.3.6.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d" connectionStringName="MySQLConn" applicationName="/" />
        </providers>

<system.data>
    <DbProviderFactories>
        <clear />
        <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.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
</system.data>

我的 POCO 对象:

[XmlRoot(ElementName = "Shop", IsNullable = false)]
[Table("shops")]
public class ShopModel

    [Key]
    public int Id  get; set; 

    // must be unique
    [Required]
    public string Name  get; set; 

    public string SiteUrl  get; set; 

    public string LogoUrl  get; set; 

    public string AffiliateSuffix  get; set; 

    public virtual ICollection<ProductModel> ProductModels  get; set; 


    [XmlRoot(ElementName = "Product", IsNullable = false)]
[Table("products")]
public class ProductModel

    [Key]
    public int Id  get; set; 

    [Required] 
    public string Title  get; set; 

    [Required] 
    public decimal Price  get; set; 

    public string ImageUrl  get; set; 

    public string ProductUrl  get; set; 

    [Required]
    public virtual ShopModel ShopModel  get; set; 

我的数据库上下文

    public class MySQLConn : DbContext

    public DbSet<ShopModel> Shops  get; set; 
    public DbSet<ProductModel> Products  get; set; 

我创建了一个模拟类,它创建了一个新的 Shop 和一个新的 Product 对象,就像这样 ctx.Shops.Add(new ShopModel ... ); ctx.Savechanges(); // 代码停在这里

当我运行我的代码时,我收到以下错误:

表“schemeName.shops”不存在

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:MySql.Data.MySqlClient.MySqlException:表 'schemeName.shops' 不存在

【问题讨论】:

【参考方案1】:

我已经找到了解决这个问题的方法。您必须获得最新版本的 Connector/NET 6.4.4。添加数据库初始化程序。将 Persist Security Info=true 添加到您的连接字符串。我做了这一切,我的工作完美。

还注意到,如果您已经有一个现有的数据库,EF 可能会抛出一个 EntityDataModel 异常。在 EF 自动创建数据库和表之前,您可能必须手动删除以前的数据库。从那时起,您对模型和 DBContext 所做的任何更改都会自动反映在数据库中。

【讨论】:

我在使用 EF4.1 + MySQL 时也遇到了一些问题。您是否在 POCO 类中尝试过任何涉及继承的上下文?让我建议你重构你的类“ProductModel”;把它变成一个抽象类,创建一个类“ProductWithImageModel”,它继承“ProductModel”和一个“ProductWithoutImageModel”,它也继承自“ProductModel”。在第一个中,放置您的“ImageUrl”属性;最后,你不能留空(它只是我们的控制)。你能做到吗? 这是我用更多细节描述我的问题的地方***.com/q/8700497/891772【参考方案2】:

您是否尝试过使用 SQL Express 来查看是否遇到相同的错误?

您是否尝试过创建数据库初始化程序?该类将像下面的代码一样声明。让它播种一些带有值的表。

public class MySQLConnInitializer : DropCreateDatabaseIfModelChanges<MySQLConn>

然后在 Global.asax.cs 中添加以下行:

Database.SetInitializer<MySQLConn>(new MySQLConnInitializer ());

【讨论】:

我已经在本地尝试使用 SQL Express,并且正确创建了带有列的表。我放弃了代码优先的方法。现在我手动创建我的表并为数据库中的每个更改更新 EF 模型。这行得通,所以我想我会坚持下去。 我现在遇到了同样的问题。起初我的项目是删除并重新创建数据库。然后我不得不手动删除数据库。现在它什么也做不了,除非我告诉它这样做。尝试添加行'Database.CreateIfNotExists();'到你的 MySQLConn 构造函数。【参考方案3】:

MySql Connector/NET 直到 6.6 版才支持 Entity Framework Code First (目前任何 6.6.6、6.7.4 或 6.8.3 都可以)。

【讨论】:

以上是关于MVC3 代码优先 - EF4.1 不会自动创建表(使用 MySQL 和 Connector/Net 6.3.6。)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MVC3 多对多关系和 EF4.1 模型优先检索数据?

EF 4.1 代码优先关系表

MVC3+EF4.1学习系列-------创建EF4.1 code first的第一个实例

如何将 Entity Framework 4.1 与 MVC 3 登录一起使用

使用默认成员关系的 MVC3 实体框架

在代码优先实体框架中手动编辑数据库