EF Core: Возможные циклы FK или несколько каскадных путей [дубликат]

Используя ES2017, вы должны иметь это как объявление функции

async function foo() {
    var response = await $.ajax({url: '...'})
    return response;
}

и выполнить его следующим образом.

(async function() {
    try {
        var result = await foo()
        console.log(result)
    } catch (e) {}
})()

Или синтаксис Promise

foo().then(response => {
    console.log(response)

}).catch(error => {
    console.log(error)

})
3
задан Jeremy Caney 30 April 2015 в 23:15
поделиться

1 ответ

Проблема заключается в том, что у вас есть несколько путей каскадных удалений, которые могут перестать пытаться удалить одну и ту же строку в таблице 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>();

Если вам нужно удалить все Bookings, связанные с Person при его удалении, мой совет настраивает отношения «один ко многим» как необязательные и переопределяет метод SaveChanges:

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

    return base.SaveChanges();
 }

Если внешний ключ на зависимом объекте имеет значение NULL, Code First не устанавливает каскадное удаление в отношении, а когда основной элемент удален, внешний ключ будет установлен на null. Таким образом, вы можете найти сирот в методе SaveChanges и удалить их

17
ответ дан octavioccl 25 August 2018 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: