EF中使用MySQL
2016-08-27 11:03
99 查看
1 配置连接字符串
<connectionStrings> <add name="MyContext" connectionString="Data Source=localhost;port=3306;Initial Catalog=****;user id=root;password=****;" providerName="MySql.Data.MySqlClient" /> </connectionStrings>
2 “Specified key was too long; max key length is 767 bytes”
出现这个错误的原因不明,暂时通过百度解决——给Context增加注解[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))] public class MyContext : DbContext { public MyContext() : base("name=MyContext")//web.config中connectionstring的名字 {} public DbSet<User> Users { get; set; } }
3 DBContext常用设置
public class PortalContext : DbContext { static PortalContext() { // 即使在Entity Framework Code First与数据库不匹配时,宁可Entity Framework Code First报出数据库连接错误,而不希望对数据库进行任何的删除创建操作。 // Entity Framework Code First提供关闭数据库初始化操作: Database.SetInitializer<PortalContext>(null); //Database.SetInitializer(new CreateDatabaseIfNotExists<PortalContext>()); //Database.SetInitializer(new DropCreateDatabaseAlways<PortalContext>()); //Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PortalContext>()); } public PortalContext() : base("name=PortalContext") { // 禁用延迟加载 this.Configuration.LazyLoadingEnabled = false; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 禁用默认表名复数形式 modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); // 禁用一对多级联删除 modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); // 禁用多对多级联删除 modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); } }
4 属性约定
[b]4.1 设置表信息[/b][Table("Product", Schema = "dbo")] public class Product
[b]4.2 设置列信息[/b]
[Column("ProductID")] public int ProductID { get; set; } [MaxLength(100)] [Required, Column("ProductName")] public string ProductName { get; set; } // 为属性指定对应的SQL SERVER数据类型: [Column("UnitPrice", TypeName = "MONEY")] public decimal UnitPrice { get; set; } [Column("Remark", TypeName = "text")] public string Remark { get; set; }
[b]4.3 设置主键[/b]
// 自定义主键 [Key] [Column("ProductID")] public int ProductID { get; set; } [Key,MaxLength(36)] public string GUID { get; set; } [MaxLength(50)] public string UserName { get; set; } //默认string映射到mysql里是longtext类型的,加长度之后就变成varchar了 [MaxLength(50)] public string PassWord { get; set; } // 取消和设置主键自增 [Key] [Column("ProductID")] [DatabaseGenerated(DatabaseGeneratedOption.None)] public int ProductID { get; set; } [Key] [Column("CategoryID")] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int CategoryID { get; set; }
[b]4.3 数字类型长度及精度[/b]
在Product类中,UnitPrice表示单价,对于价格类的字段,我们通常会希望其保留2为小数。这时可以使用Fluent API进行设置,且Data Annotation不支持该设置。
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Product>().Property(t => t.UnitPrice) .HasColumnName(< 4000 span class="hljs-string">"UnitPrice") .HasPrecision(18, 2); }
[b]4.4 非数据库字段属性[/b]
[NotMapped] public string Remark { get; set; }
5 Fluent API配置Configuration映射类
在使用Fluent API进行Entity Framework Code First数据库映射时,除了以上的在重写OnModelCreating方法中直接对Entity进行配置之外,也可以对Configurations进行配置。这时可以先写一个单独的类,将数据表的全部映射要求都写在构造函数中。using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity.ModelConfiguration; using Portal.Entities; namespace Portal.Mapping { public class ProductMap : EntityTypeConfiguration<Product> { public ProductMap() { // Primary Key this.HasKey(t => t.ProductID); // Properties this.Property(t => t.ProductID) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); this.Property(t => t.ProductName) .IsRequired() .HasMaxLength(100); // Table & Column Mappings this.ToTable("Product"); this.Property(t => t.ProductID).HasColumnName("ProductID"); this.Property(t => t.ProductName).HasColumnName("ProductName"); this.Property(t => t.UnitPrice) .HasColumnName("UnitPrice") .HasPrecision(18, 2); } } }
有了上面的映射类之后,在重写OnModelCreating方法中则可以直接调用映射类,从而减少了OnModelCreating方法的复杂度,同时也增强了代码维护的可读性。
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new ProductMap()); }
相关文章推荐
- 解决 Mysql下使用EF Code First 指定表Engine无效的思路
- Entity Framework Code First ---EF Power Tool 和MySql一起使用遇到的问题
- EF(EntityFramework)与mysql使用,取数据报错,linq实体映射错误
- .net core 中使用ef 访问mysql
- 使用 MvcMiniProfiler 监控EF 4.1 with MySQL Provider
- EF(EntityFramework)与mysql使用,乱码问题
- 关于VS2017,VS2015 中利用 EF使用Mysql 不显示数据源问题解决方案
- MVC中使用EF+MySQL
- 在EF中使用MySQL的方法及常见问题
- vs2013 ef,使用 MySQL来做数据库开发
- EF(EntityFramework)与mysql使用,序列化问题[System.ObjectDisposedException]
- ef使用dbfirst方式连接mysql
- MySQL下使用EF Code First指定表Engine无效时的解决办法
- Entity Framework Code First ---EF Power Tool 和MySql一起使用遇到的问题
- 关于VS2017,VS2015 中利用 EF使用Mysql 不显示数据源问题解决方案
- EF Core 2.0使用MsSql/MySql实现DB First和Code First
- ef使用dbfirst方式连接mysql
- 在EF中使用MySQL的方法及常见问题
- Entity Framework Code First ---EF Power Tool 和MySql一起使用遇到的问题
- 针对Mysql 使用EF Code First时 TimeStamp/RowVersion 类型 的解决办法