在EF中使用MySQL的方法及常见问题
有时需要在网上租用空间或数据库,Mysql成本低一些,所以想将sqlserver转成mysql……
注意:在安装Mysql时要选择文字集为utf8,否则将不能使用中文(当前也可以在创建数据库时使用utf8,不过我不知道在ef生成数据库时如何设置,希望高手指点)
一、在项目中引用mysql的EF包
通过NuGet包管理器安装:EntityFramework6.1.3、MySql.Data.Entity6.9.8
也可以用nuget的命令行加入:
Install-PackageMySql.Data.Entity
二、新建相关类
1、新建User实体类
并定义实例的字段长度,不定义的话会出现Specifiedkeywastoolong;maxkeylengthis767bytes的错误,这是因为string类型直接映射到mysql中的话是longtext,而mysql支持最大长度为767bytes.
publicclassUser { publicintId{get;set;} [StringLength(30)] publicstringUserName{get;set;} [MaxLength(30)] publicstringPassWord{get;set;}}
2、新建MyContext类
并说明用MySql进行实现[DbConfigurationType(typeof(MySqlEFConfiguration))]
[DbConfigurationType(typeof(MySqlEFConfiguration))] publicclassMyContext:DbContext { publicMyContext() :base("name=MyContext")//web.config中connectionstring的名字 { } publicDbSet<User>Users{get;set;} }
3、写测试代码
Database.SetInitializer(newDropCreateDatabaseIfModelChanges<MyContext>()); varcontext=newMyContext(); //插入一行值 context.Users.Add(newUser{UserName="EF6MySQL"}); context.SaveChanges();
三、配置Web.config
在<connectionStrings>中加入以下代码:
<addname="MyContext"connectionString="DataSource=localhost;port=3306;InitialCatalog=MySQL_EF;userid=root;password=root;"providerName="MySql.Data.MySqlClient"/>
完整的web.config如下:
<?xmlversion="1.0"encoding="utf-8"?> <configuration> <configSections> <!--FormoreinformationonEntityFrameworkconfiguration,visithttp://go.microsoft.com/fwlink/?LinkID=237468--> <sectionname="entityFramework"type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection,EntityFramework,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"requirePermission="false"/> </configSections> <entityFramework> <defaultConnectionFactorytype="System.Data.Entity.Infrastructure.SqlConnectionFactory,EntityFramework"/> <providers> <providerinvariantName="System.Data.SqlClient"type="System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer"/> <providerinvariantName="MySql.Data.MySqlClient"type="MySql.Data.MySqlClient.MySqlProviderServices,MySql.Data.Entity.EF6,Version=6.9.8.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"> </provider> </providers> </entityFramework> <system.data> <DbProviderFactories> <removeinvariant="MySql.Data.MySqlClient"/> <addname="MySQLDataProvider"invariant="MySql.Data.MySqlClient"description=".NetFrameworkDataProviderforMySQL"type="MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data,Version=6.9.8.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"/> </DbProviderFactories> </system.data> <connectionStrings> <addname="MyContext"connectionString="DataSource=localhost;port=3306;InitialCatalog=MySQL_EF;userid=root;password=root;"providerName="MySql.Data.MySqlClient"/> </connectionStrings> </configuration>
最后,运行程序,完成数据库自动创建
常见问题
•出现错误提示:Specifiedkeywastoolong;maxkeylengthis767bytes
1)查看实体的字符串类型属性是否设置了长度
2)MyContext类中是否声明为生成为mysql数据类型的[DbConfigurationType(typeof(MySqlEFConfiguration))]
•出现错误提示:Modelcompatibilitycannotbecheckedbecausethedatabasedoesnotcontainmodelmetadata
删除已生成的数据库后重新运行程序
•出现错误提示:序列不包含任何匹配元素
检查一下:
例如:1.
publicclassEmployee { [Key] publicintEmployeeId{get;set;} publicstringName{get;set;} [ForeignKey("ManagerId")] publicEmployeeManager{get;set;} publicintManagerId{get;set;} }[ForeignKey("ManagerId")]publicEmployeeManager{get;set;}publicintManagerId{get;set;}这个外键设置。
2.[Column(TypeName="VARCHAR(254)")]publicstringColumnName{get;set;}这样的定义,改成:[MaxLength(254)][Column(TypeName="VARCHAR")]publicstringColumnName{get;set;}3.(以下代码未测试,因为我不是这样用的,在下篇文章中将进行测试)
modelBuilder.Entity<Category>() .HasKey(c=>c.IdCategory) .HasOptional(p=>p.Children) .WithMany() .HasForeignKey(c=>c.ChildrenId);
改成:
modelBuilder.Entity<Category>() .HasKey(c=>c.IdCategory) .HasMany(p=>p.Children) .WithOptional() .HasForeignKey(c=>c.ChildrenId);
.WithMany()换成.WithOptional()
以上所述是小编给大家介绍的在EF中使用MySQL的方法及常见问题的全部叙述,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!