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

一个表写一个对应的设置类,这样就算有上百个表,那么看着也不会乱

 

posted @ 2023-08-23 22:00  二二姐  阅读(650)  评论(0编辑  收藏  举报