Usuwanie obiektu z bazy danych

0

Cześć,

Przy usunięciu obiektu otrzymuję taki komunikat. W czym problem? Błędnie skonfigurowane powiązanie w entity framework core?

		Message	"The DELETE statement conflicted with the REFERENCE constraint \"FK_Shifts_Workers_WorkerId\". The conflict occurred in database \"dbProjectFryzjer\", table \"dbo.Shifts\", column 'WorkerId'.\r\nThe statement has been terminated."	string

2

Problem jest taki ,że w bazie masz gdzieś klucz ,który odwołuje się do rekordu ,który chcesz skasować. Po skasowaniu nie miałby do czego się odwoływać. W błędzie masz nawet ładnie napisaną nazwę klucza i tabelę

0

No mam klucz w tabeli Shifts -> WorkerId, który odwołuje się do tabeli Worker -> Id, ale usuwam Worker'a, więc chciałbym aby usunął się rekord Worker z wszystkimi rekordami powiązanymi w Shifts.

1

To najpierw usuń powiązania a potem dopiero tabelę gdzie masz klucz.

3
Krispekowy napisał(a):

Cześć,

Przy usunięciu obiektu otrzymuję taki komunikat. W czym problem? Błędnie skonfigurowane powiązanie w entity framework core?

Pewnie wygenerowała się schema z on delete restrict zamiast on delete cascade lub on delete set null. Jak to wygląda w EF core, masz code first czy database first?

0

Myślałem, że entity framework to "załatwi", ale rozumiem że trzeba to ręcznie obsłużyć :)

1
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{   
    modelBuilder.Entity<User>()
        .HasOptional(a => a.UserDetail)
        .WithOptionalDependent()
        .WillCascadeOnDelete(true);
}

źródło https://stackoverflow.com/questions/17487577/entity-framework-ef-code-first-cascade-delete-for-one-to-zero-or-one-relations

Jeśli masz code first to dodaj to przy tworzeniu.

0

@superdurszlak: @Botek
W ModelSnapshot mam:

            modelBuilder.Entity("DataAccessLogic.Entities.Shift", b =>
                {
                    b.HasOne("DataAccessLogic.Entities.Worker", "Worker")
                        .WithMany("Shifts")
                        .HasForeignKey("WorkerId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();
                });

WillCascadeOnDelete(true);

nie wchodzi nigdzie :)

0

Pokaż jak usuwasz.

0

Poszło. Brakowało include

        public Worker DeleteWorker(int id)
        {
            Worker worker = _context.Workers.Include(x => x.Shifts).Single(x => x.Id == id);
            if (worker != null)
            {
                _context.Workers.Remove(worker);
                _context.SaveChanges();
            }
            return worker;
        }
0

Nie wierzę w długotrwałe powodzenie i rozwój pracując z frameworkami bazodanowymi - jeśli się nie ma wiedzy "jak to jest pod maską".
Flejmworki w tej branży dają mocno wyciekające abstrakcje (sama natura mapingu taka jest), i nie da się się żyć tylko na ujęciu wysokopoziomowym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1