1 例子: Fluent API 一对多关系
下面使用Country和City实体
public class Country{public int Id { get; set; }public string Name { get; set; }public ICollection<City> City { get; set; }}public class City{public int Id { get; set; }public string Name { get; set; }public int FKCountry { get; set; }public Country Country { get; set; }}
public ICollection<City> City { get; set; }public Country Country { get; set; }public class CountryContext: DbContext{public DbSet<City> City { get; set; }public DbSet<Country> Country { get; set; }public CountryContext(DbContextOptions<CountryContext> options) : base(options){}protected override void OnModelCreating(ModelBuilder modelBuilder){//Write Fluent API configurations heremodelBuilder.Entity<City>().HasOne(e => e.Country).WithMany(e => e.City).HasForeignKey(e => e.FKCountry).OnDelete(DeleteBehavior.Cascade); ;}}
运行EF Core migration 能够在数据库表中获取Country和City,并且在City表中创建了一个PKCountry的外键
2 理解一对多关系配置
我们开始配置Country或者City任何一个实体,配置City实体类modelBuilder.Entity<City>
接下来我们使用Has/With模式,通过使用.HasOne(e => e.Country)方法,我们指定City实体类引用导航属性Country,在他们之间将创建一个一对多的关系
.HasForeignKey(e => e.FKCountry)针对数据库City表创建了一个名为FKCountry的外键属性
modelBuilder.Entity<Country>().HasMany(e => e.City).WithOne(e=>e.Country).HasForeignKey(e => e.FKCountry);
3 使用Fluent API做级联删除
删除外键父元素时EF Core有不同的行为,我们使用Fluent API来配置该行为,如果父元素的行被删除时可以指定EF Core 删除对应的子元素数据,或者设置外键为空,或者阻止删除
modelBuilder.Entity<City>().HasOne(e => e.Country).WithMany(e => e.City).HasForeignKey(e => e.FKCountry).OnDelete(DeleteBehavior.Cascade); //Cascade behaviour
DeleteBehaviour有4个值
1 Cascade:如果主表数据被删除时,字表中关联的数据也会被删除
2 ClientSet:如果主表数据被删除时,子表中对应的外键值设置为
3 Restrict:阻止级联删除
4 Set:如果主表数据被删除时,子表中对应的外键值设置为
4 级联删除例子
Country country = new Country(){Id = 1};context.Remove(country);await context.SaveChangesAsync();
设置为级联删除后,所有City关联的Country为1的数据将会被自动删除,下面图片显示了这两张表执行完删除之后的结果

本文暂时没有评论,来添加一个吧(●'◡'●)