Ald*_*dmi 11 c# entity-framework entity-framework-core
public class Station : IEntitie
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public virtual ICollection<RegulatorySchedule> RegulatoryScheduleDispatchStations { get; set; }
public virtual ICollection<RegulatorySchedule> RegulatoryScheduleDestinationStations { get; set; }
}
public class RegulatorySchedule : IEntitie
{
[Key]
public int Id { get; set; }
public virtual Station DispatchStation { get; set; }
public virtual Station DestinationStation { get; set; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<RegulatorySchedule>()
.HasOne(s => s.DestinationStation)
.WithMany(s => s.RegulatoryScheduleDestinationStations)
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);
modelBuilder.Entity<RegulatorySchedule>()
.HasOne(s => s.DispatchStation)
.WithMany(s => s.RegulatoryScheduleDispatchStations)
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);
}
Run Code Online (Sandbox Code Playgroud)
仅当我在删除时清楚地暴露行为时,才会在迁移期间创建数据库Restrict
OnDelete (Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict).否则,它会抛出异常:
"在表'RegulatorySchedules'上引入FOREIGN KEY约束'FK_RegulatorySchedules_Stations_DispatchStationId'可能会导致循环或多个级联路径.指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束."
我需要删除表格的站点站点以及与表格相关的属性RegulatorySchedules DispatchStation和DestinationStation暴露于NULL.但是Restrict选项当你删除我无法放入的SetNull时会有异常.告诉我怎么样?
Dmi*_*try 17
描述的"问题"与实体框架无关 - 这是对MS SQL Server本身的限制.具有多个FK的表可能只有一个具有级联删除.
因此,只要您需要两个FK进行级联 - 您应该在代码中实现这样的"清理".将一个(或两个)FK设置为DeleteBehavior.Restrict,并在控制器/服务中删除之前Station手动查找并删除所有相关的RegulatorySchedule
德米特里的回答完美无缺。对于任何未来的旅行者,下面的映射表的工作样本。
代码位于类中的OnModelCreating(ModelBuilder modelBuilder)方法中
DbContext:
modelBuilder.Entity<AB>()
.HasKey(e => new { e.AId, e.BId});
modelBuilder.Entity<AB>()
.HasOne(e => e.A)
.WithMany(e => e.ABs)
.HasForeignKey(e => e.AId)
.OnDelete(DeleteBehavior.Cascade); // <= This entity has cascading behaviour on deletion
modelBuilder.Entity<AB>()
.HasOne(e => e.B)
.WithMany(e => e.ABs)
.HasForeignKey(e => e.BId)
.OnDelete(DeleteBehavior.Restrict); // <= This entity has restricted behaviour on deletion
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14241 次 |
| 最近记录: |