EF简单DataAnnotations实体配置

  1. 数据库创建表T_Persons,有Id(主键,自动增长)、Name、CreateTime字段
  2. 创建Person类
[Table("T_Persons")]//因为类名和表名不一样,所以要使用Table标注
public class Person
{
    public long Id{get;set;}
    public string Name{get;set;}
    public DateTime CreteTime{get;set;}
}

因为EF约定主键名是Id,所以不用再特殊指定Id是主键,如果非要指定就使用[key]。
因为字段名字和属性名字一致,所以不用再特殊指定属性和字段名的对应关系,如果需要特殊指定,则要用[Column("Name")]。
(*)必填字段标注[Required]、字段长度[MaxLength(5)]、可空字段用int?、如果字段在数据库有默认值,则要在属性上标注[DatabaseGenerated]。
注意实体类都要写成public,负责后面可能会有麻烦。

  1. 创建DbContext类(模型类、实体类)
public class MyDbContext:DbContext
{
    public MyDbContext():base("name=conn1")
    {
      
    }

    public DbSet<Person> Persons{get;set;}
}

EF模型的两种配置方式

DataAnnotations与FluentAPI两种。上面这种在模型类上的方式就叫做DataAnnotations。

这种方式比较方便,但是耦合度太高,不符合大项目开发的要求。一般的类最好是POCO(Plain Old c# Objec)类,没有继承上面特殊的父类,没有标注上面特殊的Attribute,没有定义什么特殊的方法,就是一对普通的属性。

微软推荐使用FluentAPI的使用方式。

FluentAPI实体配置

  1. 创建Person类
  2. 创建PersonConfig类,放到ModelConfig文件夹下(PersonConfig、EntityConfig这样的名字都不是必须的)
class PersonConfig:EntityTypeConfiguration<Person>
{
    public PersonConfig()
    {
        this.ToTable("T_Person");
    }
}
  1. 创建DbContext类
public class MyDbContext:DbContext
{
    public MyDbcontext():base("name=conn1")
    {
        
    }
    
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        //推荐用法
        modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly();
        //另一种写法
        //modelBuilder.Entity<Person>().ToTable("T_Persons");
        //还有一种写法
        //modelBuilder.Configuration.Add(new PersonConfig());
        
    }
    
    public DbSet<Person> Persons{get;set;}
}

modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly();代表从这句话所在的程序集加载所有的继承自EntityTypeConfiguration为模型配置类

FluentAPI更多配置

  1. HasMaxLength
class PersonConfig:EntityTypeConfiguration<Person>
{
    public PersonConfig()
    {
        this.ToTable("T_Person");
        this.Property(s=>s.Name).HasMaxLength(30);
    }
}
  1. IsRequired 与 IsOptional
 this.Property(s=>s.Name).IsRequired();
 this.Property(s=>s.Name).IsOptional();
  1. 其它
//主键
this.Property(s=>s.PId).HasKey();
//字段不参与映射数据库
this.Ignore(s=>s.Name);
//是否对应固定长度
this.Property(s=>s.Name).IsFixedLength();
//对应的数据库类型是varchar
this.Property(s=>s.Name).IsUnicode(false);
//ID对应数据库中字段名为ID的字段
this.Property(s=>s.Name).HasColumnName("MingCheng");
//指定字段是自动增长类型
this.Property(s=>s.Id).HasDataBaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);

补充

  1. Enable-Migrations
    执行 Enable-Migrations 时可能会因为错误而打断,此时需要再次运行加参数的命令Enable-Migrations -Force:
  2. 设置 AutomaticMigrationsEnabled为 true
  3. 最后执行 Update-Database

https://www.cnblogs.com/libingql/p/3351275.html

在数据库初始化产生时进行控制
有三个方法可以控制数据库初始化时的行为。

1 CreateDatabaseIfNotExists
CreateDatabaseIfNotExists方法会在没有数据库时创建一个,这是默认行为。

            Database.SetInitializer( 
                new CreateDatabaseIfNotExists<BreakAwayContext>());
            using (var context = new BreakAwayContext())
            {
                context.Database.Initialize(true);
            }

2 DropCreateDatabaseIfModelChanges
如果我们在在模型改变时,自动重新创建一个新的数据库,就可以用这个方法。在这开发过程中非常有用。

            Database.SetInitializer(
                new DropCreateDatabaseIfModelChanges<BreakAwayContext>());
            using (var context = new BreakAwayContext())
            {
                context.Database.Initialize(true);
            }

3 DropCreateDatabaseAlways
如果你想在每次运行时都重新生成数据库就可以用这个方法。

            Database.SetInitializer(
                new DropCreateDatabaseAlways<BreakAwayContext>());
            using (var context = new BreakAwayContext())
            {
                context.Database.Initialize(true);
            }
最后修改:2022 年 04 月 14 日
如果觉得我的文章对你有用,请随意赞赏