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 模型优先检索数据?
MVC3+EF4.1学习系列-------创建EF4.1 code first的第一个实例