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