Użytkownik, pracodawca, kandydat i praca, pracodawca może utworzyć wiele zleceń, a każde zlecenie może mieć tylko jednego pracodawcę, kandydat może ubiegać się o wiele zleceń, a każde zlecenie może składać się z wielu członków.Wprowadzenie ograniczenia FOREIGN KEY może powodować cykle lub wiele ścieżek kaskadowych. Podaj przy usuwaniu brak działania
więc związek jest tak:
Używam jednostka kodu ramy pierwsze podejście, w tej chwili, jeśli usunę pracodawca ma zamiar usunąć wszystkie powiązane zadania, a użytkownik z bazy danych, a jeśli usunę kandydata, że ma zamiar usunąć użytkownika:
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();
Wszystko działa poprawnie z wyjątkiem kiedy podać wiele do wielu relacji między kandydatami i pracy i aktualizuje bazę danych przy użyciu „update-baza ”, To daje mi ten błąd:
Wprowadzenie ograniczenia klucz obcy«FK_dbo.MemberJobMap_dbo.Jobs_JobId»na stole«MemberJobMap»może powodować cykli lub wiele ścieżek kaskadowe. Określ ON DELETE NO ACTION lub ON UPDATE NO ACTION lub zmodyfikuj inne ograniczenia klucza OBCEGO. Nie można utworzyć ograniczenia. Zobacz poprzednie błędy.
Oto jak podano wiele do wielu relacji:
modelBuilder.Entity<Member>()
.HasMany(m => m.Jobs)
.WithMany(j => j.Members)
.Map(c =>
{
c.MapLeftKey("Id");
c.MapRightKey("JobId");
c.ToTable("MemberJobMap");
});
i kiedy dodać migracji:
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);
Próbuję zmienić cascadeDelete się fałszywe, ale to daje mi błąd, gdy usunę kandydat, który złożył podanie lub gdy próbuję usunąć pracę z kandydującymi kandydatami.
Jak naprawić ten błąd? Tak że:
- Kiedy zadanie zostanie usunięte, to będzie usunąć skojarzone tabeli candidatejobmap wierszy bez dokonania jakiejkolwiek innej tabeli
- Gdy kandydat zostanie usunięty, to będzie usunąć skojarzone tabeli candidatejobmap wiersze i stół użytkownik wiersz bez dokonywania jakichkolwiek innej tabeli
- Przy zachowaniu wszystkich innych określonych kaskada usuwać działania samo
ukryłeś problem, usuwanie kaskadowe powinno działać z dowolnej strony tabeli łączenia. to nie pachnie jak błąd w ER M, albo błędem w sposobie, w jaki go używasz. – Jasen
@Jasen Proszę wyjaśnić, ponieważ kaskadowe usuwanie z obu stron nie działa dla mnie, daje mi błąd, o który poprosiłem – Mindless
Tak, mam jeszcze prostszą konfigurację z pojedynczą jednostką "wiele do wielu" i otrzymuję ten sam błąd, gdy Próbuję włączyć usuwanie kaskadowe zarówno z jednego do wielu relacji w tym samym czasie.Myślę, że jest to po prostu ograniczenie SQL Server. –