Пользователь, работодатель, кандидаты и Job, работодатель может создавать несколько заданий, и каждое задание может иметь только одного работодателя, кандидат может подать заявку на многие задания, и каждое задание может иметь несколько примененных членов.
Итак, соотношение выглядит так:
Я использую первый подход сущностного кода, на данный момент, если я удалю работодателя, он удалит все связанные задания и пользователя из базы данных, и если я удалю кандидата, он удалит пользователя:
modelBuilder.Entity<Employer>()
.HasRequired(e => e.User)
.WithOptional(e => e.Employer).WillCascadeOnDelete();
//member is candidate
modelBuilder.Entity<Member>()
.HasRequired(e => e.User)
.WithOptional(e => e.Member).WillCascadeOnDelete();
modelBuilder.Entity<Employer>()
.HasMany(a => a.Jobs)
.WithRequired(b => b.Employer)
.WillCascadeOnDelete();
Все работает отлично, за исключением случаев, когда я указываю много-много отношений между кандидатами и заданием и обновляю базу данных с помощью "update-database", она дает мне эту ошибку:
Представление ограничения FOREIGN KEY "FK_dbo.MemberJobMap_dbo.Jobs_JobId" в таблице "MemberJobMap" может вызывать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY. Не удалось создать ограничение. См. Предыдущие ошибки.
Вот как я определил многие отношения:
modelBuilder.Entity<Member>()
.HasMany(m => m.Jobs)
.WithMany(j => j.Members)
.Map(c =>
{
c.MapLeftKey("Id");
c.MapRightKey("JobId");
c.ToTable("MemberJobMap");
});
и когда я добавляю миграцию:
CreateTable(
"dbo.MemberJobMap",
c => new
{
Id = c.String(nullable: false, maxLength: 128),
JobId = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.Id, t.JobId })
.ForeignKey("dbo.Members", t => t.Id, cascadeDelete: true)
.ForeignKey("dbo.Jobs", t => t.JobId, cascadeDelete: true)
.Index(t => t.Id)
.Index(t => t.JobId);
Я попробовал изменить cascadeDelete на false, но это дает мне ошибку, когда я удаляю кандидата, у которого есть прикладные задания, или когда я пытаюсь удалить задание с применением кандидатов.
Как исправить эту ошибку? Так что:
- Когда задание удалено, оно будет удалять связанные rowsjobmap строк таблицы без каких-либо других таблиц
- Когда кандидат удаляется, он удаляет связанные rowsjobmap строк таблицы и строки пользовательских таблиц без каких-либо другая таблица
- При сохранении всех других указанных действий удаления каскада тот же