EF中使用MySQL

来源:互联网 发布:深入浅出node.js 完整 编辑:程序博客网 时间:2024/05/17 23:24

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 属性约定

4.1 设置表信息
[Table("Product", Schema = "dbo")]public class Product
4.2 设置列信息
[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; }
4.3 设置主键
// 自定义主键[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; }
4.3 数字类型长度及精度

在Product类中,UnitPrice表示单价,对于价格类的字段,我们通常会希望其保留2为小数。这时可以使用Fluent API进行设置,且Data Annotation不支持该设置。

protected override void OnModelCreating(DbModelBuilder modelBuilder){    modelBuilder.Entity<Product>().Property(t => t.UnitPrice)        .HasColumnName("UnitPrice")        .HasPrecision(18, 2);}
4.4 非数据库字段属性
[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());}
0 0
原创粉丝点击