您的位置:首页 > 数据库 > MySQL

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());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  EF MySql code-first