EF Core 模型优先——根据类对象创建数据表

需要的nuget包

  •   Microsoft.EntityframeworkCore.SqlServer  (根据自己的数据库类型选择对应的nuget包)
  •   Microsoft.EntityframeworkCore.Tools
  •   Microsoft.VisualStudio.Web.CodeGeneration.Design

说明:

(1)本文测试使用的数据库是SqlServer2017; 

(2)如果没有Microsoft.EntityFrameworkCore.Design,在PM上执行命令会失败(如下图)
PM> add-migration initicial
Build started...
Build succeeded.
Your startup project 'CoreDemo' doesn't reference Microsoft.EntityFrameworkCore.Design. This package is required for the Entity Framework Core Tools to work. Ensure your startup project is correct, install the package, and try again.

两个类:Grade(年级)、Student(学生)

一个枚举:Gender(性别)

    /// <summary>
    /// 性别枚举  
    /// </summary>
    public enum Gender
    {
        //一定要写上枚举对应的数字值 
         
        男 = 1,
        女 = 2,
    }


    /// <summary>
    /// 年级实体类
    /// </summary>
    public class Grade
    {
        /// <summary>
        /// 年级Id是主键
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// 年级名称
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 年级里的学生
        /// </summary>
        public List<Student> Students { get; set; } = new List<Student>();
    
    }

    /// <summary>
    /// 学生实体类
    /// </summary>
    public class Student
    {
        /// <summary>
        /// 学生编号
        /// </summary> 
        public int Id { get; set; }

        /// <summary>
        /// 学生姓名
        /// </summary> 
        public string Name { get; set; }

        /// <summary>
        /// 性别
        /// </summary>
        public Gender Gender { get; set; }

        /// <summary>
        /// 所在年级编号
        /// </summary> 
        public int GradeId { get; set; }

        /// <summary>
        /// 所在年级
        /// </summary>
        public Grade Grade { get; set; }
 
        /// <summary>
        /// 默认联系电话
        /// </summary> 
        public string? Tele { get; set; }

        /// <summary>
        /// 联系电话2
        /// </summary> 
        public string? Tele2 { get; set; }

    }

关系

  1. 一个年级有多个学生,一个学生只能属于一个年级
  2. 每个学生都必须录入性别信息


        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        { 
            //数据库连接字符串
            string connStr = "Data Source=127.0.0.1;Initial Catalog=EFDemoTestDB;User ID=sa;Password=123456;TrustServerCertificate=true";
             
            optionsBuilder.UseSqlServer(connStr);

            //设置输出EF Core背后执行的SQL语句到控制台
            optionsBuilder.LogTo(Console.WriteLine);
            base.OnConfiguring(optionsBuilder); 
        }


        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {

            //设置Grade对应的数据表
            modelBuilder.Entity<Grade>(x => {

                x.ToTable("T_Grade"); //设置表名称
                x.HasKey(x => x.Id); //设置主键
                x.Property(c => c.Name).HasColumnType("nvarchar(10)").IsRequired();//设置字段类型 
            });

            //设置Student对应的数据表
            modelBuilder.Entity<Student>(x => {

                x.ToTable("T_Student");
                x.HasKey(c => c.Id);
                x.Property(c => c.Name).HasMaxLength(10).IsRequired().IsUnicode();

                //设置Tele Tele2字段是varchar(11) null 类型
                x.Property(c => c.Tele).HasMaxLength(11).IsRequired().IsUnicode(false).IsRequired(false);
                x.Property(c=>c.Tele2).HasMaxLength(11).IsRequired().IsUnicode(false).IsRequired(false);

                //设置Gender列
                x.Property(c => c.Gender)
                .HasConversion(c => (int)c, y => (Gender)Enum.ToObject(typeof(Gender), y))//Gender列存储Enum对应的int值
                .IsRequired();//Gender列不能为空


                //设置GradeId字段是外键 Grade与Student是一对多关系
                x.HasOne<Grade>(c => c.Grade).WithMany(y => y.Students).HasForeignKey(z => z.GradeId); 
            }); 

            base.OnModelCreating(modelBuilder);
        }

生成数据表

        主要执行的语句:

  • PM> add-migration initicial 
  • PM> update-database 
PM> add-migration initicial
Build started...
Build succeeded.
To undo this action, use Remove-Migration.

PM> update-database
Build started...
Build succeeded.
Done.

查看生成的对应数据库表

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Entity Framework 中,可以使用 DbContext 类来创建数据库和数据表。以下是创建数据库和数据表的基本步骤: 1. 定义 DbContext 类:创建一个继承自 DbContext 的类,并在类中定义 DbSet 属性或 DbSet 集合,表示要在数据库中创建数据表。 例如,定义一个名为 MyDbContext 的 DbContext 类,其中包含名为 Customers 的 DbSet 属性,表示要创建一个名为 Customers 的数据表。 ``` public class MyDbContext : DbContext { public DbSet<Customer> Customers { get; set; } } ``` 2. 配置数据库连接:在应用程序的配置文件(如 app.config 或 web.config)中,配置数据库连接字符串,指定要使用的数据库类型和连接信息。 例如,以下是使用 SQL Server 数据库的连接字符串示例: ``` <connectionStrings> <add name="MyDbContext" connectionString="Data Source=.;Initial Catalog=MyDatabase;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings> ``` 3. 创建数据库和数据表:在应用程序启动时,创建 DbContext 实例,并调用其 Database 属性的 Create 方法,以创建数据库和数据表。 例如,以下是在应用程序启动时创建 MyDbContext 实例,并调用其 Database.Create 方法创建数据库和数据表的示例: ``` using (var context = new MyDbContext()) { context.Database.CreateIfNotExists(); } ``` 这将创建名为 MyDatabase 的数据库,并在其中创建一个名为 Customers 的数据表。 注意,如果数据库和数据表已经存在,则不会执行任何操作。如果要在数据库中添加新的数据表,只需在 DbContext 类中添加新的 DbSet 属性即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值