Najpierw używam kodu EF do opracowania mojej 3-warstwowej aplikacji WinForm, użyłem rozłączonego POCO
s jako mojego modelowe. Wszystkie moje podmioty odziedziczyły po klasie BaseEntity
.Znajdowanie encji z tym samym kluczem w grafie obiektów dla zapobiegania "Obiekt z tym samym kluczem już istnieje w ObjectStateManager" Błąd
użyłem rozłączonych POCO
s, więc obsługiwać podmiot na State
po stronie klienta, aw ApplyChanges()
metody, załączam mój wykres jednostki (np Order
z jego OrderLines
i Products
) do mojego DbContext
a następnie zsynchronizować każdy podmiot na State
z jego strona klienta State
.
public class BaseEntity
{
int _dataBaseId = -1;
public virtual int DataBaseId // DataBaseId override in each entity to return it's key
{
get { return _dataBaseId; }
}
public States State { get; set; }
public enum States
{
Unchanged,
Added,
Modified,
Deleted
}
}
Więc kiedy chcę zapisać wykres podmiotami powiązanymi, użyłem następujących metod:
public static EntityState ConvertState(BaseEntity.States state)
{
switch (state)
{
case BaseEntity.States.Added:
return EntityState.Added;
case BaseEntity.States.Modified:
return EntityState.Modified;
case BaseEntity.States.Deleted:
return EntityState.Deleted;
default:
return EntityState.Unchanged;
}
}
public void ApplyChanges<TEntity>(TEntity root) where TEntity : BaseEntity
{
_dbContext.Set<TEntity>().Add(root);
foreach (var entry in _dbContext.ChangeTracker
.Entries<BaseEntity>())
{
BaseEntity stateInfo = entry.Entity;
entry.State = ConvertState(stateInfo.State);
}
}
Ale jeśli mój wykres zawiera 2 lub więcej podmiotów z tego samego klucza daję ten błąd:
An object with the same key already exists in the ObjectStateManager...
jaki sposób można wykryć podmioty z tych samych kluczy w moim wykresie (root
) i ich wyjątkowy w moim sposobie ApplyChanges()
?
Jak "przekazujesz wykres"? I dlaczego twoje podmioty implementują 'INotifyPropertyChanged'? –
głównym obiektem jest wykres TEntities, implementuję INotifyPropertyChanged, aby mógł wiązać obiekty z winUI. – Masoud
@Masoud Czy ta sama wartość 'ID' -1? Być może wystarczy poprawnie oznaczyć elementy do dodania, w przeciwieństwie do aktualizacji lub coś tak prostego. Fakt, że masz kolizje ID, niekoniecznie jest związany z EF, brzmi to tak, jakbyś robił wiele rzeczy poza EF. –