EF中使用MySQL

本文介绍了在EF中使用MySQL时的配置步骤,包括连接字符串设置、解决"Specified key was too long"错误、DBContext的常用配置以及Fluent API的详细应用,如属性约定、表和列的映射、主键设置、数字类型精度等,旨在提供一套完整的EF与MySQL Code First集成指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值