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 here
modelBuilder.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的数据将会被自动删除,下面图片显示了这两张表执行完删除之后的结果
本文暂时没有评论,来添加一个吧(●'◡'●)