EF简单DataAnnotations实体配置
- 数据库创建表T_Persons,有Id(主键,自动增长)、Name、CreateTime字段
- 创建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,负责后面可能会有麻烦。
- 创建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实体配置
- 创建Person类
- 创建PersonConfig类,放到ModelConfig文件夹下(PersonConfig、EntityConfig这样的名字都不是必须的)
class PersonConfig:EntityTypeConfiguration<Person>
{
public PersonConfig()
{
this.ToTable("T_Person");
}
}
- 创建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更多配置
- HasMaxLength
class PersonConfig:EntityTypeConfiguration<Person>
{
public PersonConfig()
{
this.ToTable("T_Person");
this.Property(s=>s.Name).HasMaxLength(30);
}
}
- IsRequired 与 IsOptional
this.Property(s=>s.Name).IsRequired();
this.Property(s=>s.Name).IsOptional();
- 其它
//主键
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);
补充
- Enable-Migrations
执行 Enable-Migrations 时可能会因为错误而打断,此时需要再次运行加参数的命令Enable-Migrations -Force: - 设置 AutomaticMigrationsEnabled为 true
- 最后执行 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);
}