gpt4 book ai didi

c# - Entity Framework 代码优先 : cycles or multiple cascade paths

转载 作者:太空宇宙 更新时间:2023-11-03 14:58:12 26 4
gpt4 key购买 nike

我有一个 Booking 类,它有一个预订联系人(Person)和一组导航属性(People),这些属性通过连接表链接到另一组Person 中的导航属性 (Bookings)。如何生成为预订联系人关系启用级联删除的 Booking 表?当我将它排除在流畅的 API 代码之外(启用级联删除的默认设置)时,我从迁移中收到以下错误消息:

Introducing FOREIGN KEY constraint 'FK_dbo.BookingPeople_dbo.People_PersonID' on table 'BookingPeople' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

Could not create constraint or index. See previous errors.

 modelBuilder.Entity<Person>()
.HasMany<Booking>(s => s.aBookings)
.WithRequired(s => s.Contact)
.HasForeignKey(s => s.ContactId);


modelBuilder.Entity<Booking>()
.HasMany(t => t.People)
.WithMany(t => t.Bookings)
.Map(m => {
m.ToTable("BookingPeople");
m.MapLeftKey("BookingID");
m.MapRightKey("PersonID");
});

最佳答案

问题是您有多个级联删除路径,最终可能会尝试删除数据库中 BookingPeople 表中的同一行。

您可以通过使用 Fluent API 在一对多关系中禁用级联删除来避免此类不明确的删除路径。 :

    modelBuilder.Entity<Booking>()
.HasRequired(s => s.Contact)
.WithMany(s => s.aBookings)
.HasForeignKey(s => s.ContactId)
.WillCascadeOnDelete(false);

或者通过将关系定义为可选(使用可为空的外键,但您不能使用 Fluent Api 配置与级联删除的关系)。

     modelBuilder.Entity<Booking>()
.HasOptional(s => s.Contact)
.WithMany(s => s.aBookings)
.HasForeignKey(s => s.ContactId);// ContactId is a nullable FK property

此外,您可以使用以下方法删除级联删除约定:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

或者在多对多关系的情况下:

modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

如果您需要在删除时删除与 Person 关联的所有 Bookings,我的建议是将一对多关系配置为可选,并覆盖SaveChanges 方法:

public override int SaveChanges()
{
Bookings.Local
.Where(r => r.ContactId == null)
.ToList()
.ForEach(r => Bookings.Remove(r));

return base.SaveChanges();
}

如果依赖实体上的外键可以为空,Code First 不会在关系上设置级联删除,当主体被删除时,外键将设置为 null。这样就可以在SaveChanges方法中找到孤儿并删除

关于c# - Entity Framework 代码优先 : cycles or multiple cascade paths,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47798687/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com