Это один из случаев, когда EF не может автоматически связать свойства навигации отношений.
Обычно его можно разрешить с помощью атрибутов InverseProperty
или Has
/ With
свободный API. Но поскольку этот тип отношений всегда приводит к проблеме «нескольких каскадных путей», которая требует отключения каскадного удаления по крайней мере для одного из отношений, и это может быть сделано только с помощью свободного API, нет другого выбора, кроме как использование свободного API (который для отношений ИМХО все равно лучше).
Минимум - настроить отношения, для которых вы хотите отключить каскадное удаление. Как только вы это сделаете, EF сделает все остальное.
Например:
modelBuilder.Entity<AssetHeader>()
.HasMany(e => e.AssetEquipment)
.WithRequired(e => e.AssetEquipment)
.WillCascadeOnDelete(false);
Результат:
CreateTable(
"assets.AssetHeaderEquipment",
c => new
{
AssetHeaderId = c.Guid(nullable: false),
AssetEquipmentId = c.Guid(nullable: false),
StartDate = c.DateTime(nullable: false),
EndDate = c.DateTime(),
Comment = c.String(maxLength: 255),
})
.PrimaryKey(t => new { t.AssetHeaderId, t.AssetEquipmentId })
.ForeignKey("assets.AssetHeader", t => t.AssetEquipmentId)
.ForeignKey("assets.AssetHeader", t => t.AssetHeaderId, cascadeDelete: true)
.Index(t => t.AssetHeaderId)
.Index(t => t.AssetEquipmentId);
CreateTable(
"assets.AssetHeader",
c => new
{
Id = c.Guid(nullable: false),
})
.PrimaryKey(t => t.Id);
Обновление В зависимости от проблемного варианта использования правильные пары должны быть:
Collection Inverse FK
========== ========= ==============
AssetHeaders AssetEquipment AssetEquipmentId
AssetEquipment AssetHeader AssetHeaderId
Следовательно, удалите вводящие в заблуждение атрибуты ForeignKey
и используйте следующую полностью явную свободную конфигурацию:
modelBuilder.Entity<AssetHeader>()
.HasMany(e => e.AssetHeaders)
.WithRequired(e => e.AssetEquipment)
.HasForeignKey(e => e.AssetEquipmentId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<AssetHeader>()
.HasMany(e => e.AssetEquipment)
.WithRequired(e => e.AssetHeader)
.HasForeignKey(e => e.AssetHeaderId)
.WillCascadeOnDelete(true);