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

时间:2011-06-13 11:54:36

标签: mysql asp.net-mvc-3 entity-framework-4.1 mysql-connector

EF 4.1与MySQL和Connector / Net 6.3.6一起不会根据我的POCO对象自动创建表格。我不确定我的配置是否错误或者Connector / .Net 6.3.6是否支持此功能。我已经在互联网上爬了一个星期而没有找到答案,我相信我已经在stackoverflow上完成了所有的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; }
}

我的DBContext

    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'不存在

3 个答案:

答案 0 :(得分:0)

您是否尝试过使用SQL Express查看是否收到同样的错误?

您是否尝试过创建数据库初始化程序?该类将被声明为如下代码。让它为一些表格带来价值。

public class MySQLConnInitializer : DropCreateDatabaseIfModelChanges<MySQLConn>

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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