2009-11-20 12 views
8

Używam Entity Framework, a jego elementami są: Database Reprezentacja AND obiekt biznesowy.
Oznacza to, że niektóre jednostki, które są manipulowane, powinny zawsze pozostawać odłączone od kontekstu.Uniemożliwienie jednostce Entity Framework automatycznego dołączania podmiotów

Udało mi się odczytać i zapisać dane z bazy danych, ale mam mały problem przy aktualizacji:
Mam tabelę "Stock", która jest połączona z jedną tabelą "Magazyn".

Obecny proces ten (uproszczona, ale duch pozostaje, istnieje więcej pól):

  • nowy obiekt Grafika jest tworzona i jej pola są wypełnione pewnych wartości (data ...)
  • aktualny magazyn (obiekt pobrany dla całego żądania z bazy danych) jest powiązany z obiektem magazynowym
  • obiekt jest wysyłany do metody DAL, której praca polega na zapisaniu.
  • Metoda DAL sprawdza, czy pozycja magazynowa istnieje już w dniu (ta sama data, magazyn i ten sam typ) w bazie danych
  • Jeśli istnieje, metoda aktualizuje wolumin z wyciągniętego obiektu i zapisuje zmiany.
  • W przeciwnym razie zostanie wstawiony nowy obiekt Stock.

Problem polega na tym, że gdy tworzę nowy obiekt Image i powiązać go do Skład, EntityState obiekt jest automatycznie ustawiany na „Dodano”. Więc kiedy wykonuję SaveChanges() i magazyn już istnieje, linia jest aktualizowana I nowa linia Stock jest dodawana ...
Chciałbym zachować nowy obiekt Stock, dopóki sam go nie dołączę. Nie chcę, żeby to się działo automatycznie.

Jedyne znalezione rozwiązanie to Odłączenie nowego obiektu od kontekstu przed zapisaniem, jeśli obiekt już istnieje.
Mogę również odłączyć() obiekt Warehouse, ale to nie jest satysfakcjonujące rozwiązanie, tak jak w prawdziwym przypadku jest więcej elementów do skojarzenia i nie jestem pewien, czy to dobry pomysł, aby grać z Attach() i Detach() na nich.
W tym przypadku, dopóki sam nie "dodaję" go do kontekstu, obiekt jest tylko obiektem "Transport" i chciałbym, aby był poza kontekstem.

Czy masz pojęcie, w jaki sposób mogę oddzielić obiekt magazynowy?


Code (może to być trochę niepoprawne, napisałem go z pamięci):

Stock stk = new Stock(); 
stk.Date = DateTime.Now; 
stk.Volume = 100;   //so far stk is "Detached" and that's cool. 
stk.Warehouse = CurrentWarehouse; //stk become "Added" and that's less cool. 

DAL.Stock.Instance.Save(stk); 

W save():

var existing = (from s in Context.CurrentContext.Stock 
where s.Warehouse.WarehouseId == stk.Warehouse.WarehouseId && s.Date == stk.Date && s.Type == 2 
select s).FirstOfDefault(); 

if(existing != null) 
{ 
    existing.Volume = stk.Volume; 
    Context.CurrentContext.Detach(stk); //I find it a stupid workaround !!!!!! 
} 
else 
{ 
    Context.CurrentContext.AddToStock(stk); //what I would want to do. 
} 

Context.CurrentContext.SaveChanges() 
+0

To samo dla mnie! Zrozumiałeś to? –

+0

Niestety nie.I nie pamiętam obejścia, którego użyłem. Myślę, że zacząłem używać obiektów POCO. –

Odpowiedz