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());
}