Entity framework duplikaty

0

Mam klasy

public class A
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id
    public string nazwa
    public virtual B B
}
public class B
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id
    public string nazwa
    public int ilosc
}
 

zapisuję sobie bo bazy danych rekord B, a poźniej chcę zapisać rekord A w którym będzie odwołanie do rekordu B,to w bazie danych będę miał utworzone w tabeli B dwa razy ten sam rekord. Jak można pozbyć się tego duplikowania rekordów?

0

Z jednej strony, to jeden obiekt powinien być korzeniem grafu.
Z drugiej strony, może brakuje Ci po prostu przeciążenia metody Equals, i EF się gubi, bo nie jest w stanie rozpoznać, że dany obiekt już istnieje.

0

@lc90

Dla pewności zamieść kod w jaki sposób dodajesz tworzone encje do kontekstu oraz jak je zapisujesz. Z twojego opisu jednak nasuwa mi się wniosek, że prawdopodobnie pracujesz na odłączonym od kontekstu grafie obiektów (stan 'detached'). Entity Framework ma z tym masę problemów. Jeśli dodajesz encję do kontekstu poprzez metodę Add() to wtedy nie tylko właściwa encja ale wszystkie powiązania (jeśli nie zostały wcześcniej przypięte do kontekstu) mają nadawany stan 'Added'. Wartość identyfikatorów/kluczy jest wtedy bez znaczenia dlatego obiekt klasy 'B' został ponownie utworzony w bazie.

0
somekind napisał(a):

Z jednej strony, to jeden obiekt powinien być korzeniem grafu.
Z drugiej strony, może brakuje Ci po prostu przeciążenia metody Equals, i EF się gubi, bo nie jest w stanie rozpoznać, że dany obiekt już istnieje.

Entity Framework rozpoznaje encje po tzw. EntityKey czyli kluczu encji zdefiniowanym (poprzez konwencję lub własne mapowanie). Nie pozwoli przypiąć do kontekstu (operacja 'attach') dwóch encji tego samego typu o takim samym EnitityKey. Dlatego dla przypadku nowo tworzonych obiektów o domyślnej wartości EntityKey istnieje operacja Add() na DbSet<> która działa jak działa. Poza tym przypadkiem dla Entity Framework na poziomie DbContext'u nie ma znaczenia jakiej wartości są dane klucze. Istotny jest ich stan :)

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