net6 使用ef core 映射mysql数据库(方法一)
环境 :net6+mysql
1.安装下载nuget包
Pomelo.EntityFrameworkCore.MySql
和Microsoft.EntityFrameworkCore.Design
如下图
2.创建一个模型类,之后映射到数据库里面的表、字段和这个类是一致的。
public class Movies { /// <summary> /// id /// </summary> [Required] public string Id { get; set; } /// <summary> /// 电影 /// </summary> public string Film { get; set; } /// <summary> /// 电视剧 /// </summary> public string Tv { get; set; } /// <summary> /// 动漫 /// </summary> public string Anime { get; set; } }
3.数据库连接字符串
"ConnectionStrings": { "DefaultConnection": "server=localhost;port=3306;database=movies;user=root;password=root;" },
如下图
4.创建一个上下文并继承DbContext
public class FilmDbContext : DbContext { public FilmDbContext(DbContextOptions<FilmDbContext> options) : base(options) { } public DbSet<Movies> MoviesTypes { get; set; } }
5.在program类中添加代码连接数据库
//连接数据库 builder.Services.AddDbContext<FilmDbContext>( options => { options.UseMySql(builder.Configuration.GetConnectionString("DefaultConnection"), new MySqlServerVersion(new Version(8, 0, 2))); });
如下图
6.然后在 程序包管理控制台 写 迁移命令
(1)程序包管理控制台 添加 Add-Migration init2 然后回车
这时候就创建一个 EF Core 迁移,生成一个名init2 的迁移文件
如下图
(2)程序包管理控制台 更新Update-Database 然后回车
上述步骤都执行完一个net6框架 使用efcore 连接mysql 数据库就创建成功,嗯可以使用了。但是第4步这样写没有规定字段大小,表和表之间没有关系,对于这种问题可以有两种写法解决
(1)在上下文MoviesDbContext中的方法OnModelCreating中写
protected override void OnModelCreating(ModelBuilder modelBuilder) { var movies = modelBuilder.Entity<Movies.Model.Movie>().ToTable("Movies"); movies.HasKey(x => x.Id); movies.Property(t => t.Id).ValueGeneratedOnAdd(); movies.Property(t => t.Name).HasMaxLength(50);//字段Name设置最大长度为50 var movies_types = modelBuilder.Entity<MoviesTypes>().ToTable("Movies_Types"); movies_types.Property(x => x.Id).IsRequired().HasAnnotation("Id", true); movies_types.Property(x => x.MoviesType); movies_types.HasMany(t => t.Movie).WithOne(t => t.MoviesTypes).HasForeignKey(t => t.MoviesTypesId).OnDelete(DeleteBehavior.Cascade);//表关联 }
(2)上面(1)的方法也存在弊端,因为所有表设置都在一个方法里,如果表比较多,那么这个方法就会很长,所以下面的写法可以有效解决这个问题
新创建个表类MovieEntityTypeConfiguration,继承IEntityTypeConfiguration<表名>,在方法MovieEntityTypeConfiguration中写设置
public class MovieEntityTypeConfiguration : IEntityTypeConfiguration<Movie> { public void Configure(EntityTypeBuilder<Movie> builder) { builder.ToTable("movie"); builder.HasKey(x => x.Id); builder.Property(t => t.Id).ValueGeneratedOnAdd(); //builder.Ignore(t => t.Messages);//隐藏 builder.Property(t => t.Area).HasMaxLength(100); builder.HasOne(t => t.MoviesCharacter).WithOne(t => t.Movie).HasForeignKey<MoviesCharacter>(t => t.Id).OnDelete(DeleteBehavior.Cascade);//表关联 builder.HasOne(t => t.MoviesRelated).WithOne(t => t.Movie).HasForeignKey<MoviesRelated>(t => t.Id).OnDelete(DeleteBehavior.Cascade); builder.HasOne(t => t.MoviesPlaybackPath).WithOne(t => t.Movie).HasForeignKey<MoviesPlaybackPath>(t => t.Id).OnDelete(DeleteBehavior.Cascade); } }
一个表写一个对应的设置类,这样就算有上百个表,那么看着也不会乱