Aktywne Wpisy
xeacaex +134
Wczoraj wieczorem prawie zginąłem ‚na Sebastiana’ na krajowej 7 na wysokości jakiejś wiochy przed Kielcami. Chciałem wyprzedzić ciężarówkę, ale widziałem auto w lusterku które strasznie z----------o, pewnie lekko z 250 km/h, więc poczekałem. Gdy wyjechałem na lewy pas to ‚magicznie’ ukazało się drugie które ledwo co wyhamowało (oczywiście BMW). Nie wiem, może to moja wina, bo nie sprawdziłem lusterka pierdyliard razy, ale wiem jedno - rzygam już jazdą autem po Polsce. Na
szynszyla2018 +17
No i pospane. 3 h snu XD zajebiste. Ale jak pójdziesz do dzbana lekarza to ci powie żebyś sobie zrobił kąpiel przed snem XDDD nie wiem skąd oni tych dzbanów biorą. #lekarz #bezsennosc
To już dzisiaj moje drugie pytanie do ef ale tym razem już sam sobie nie odpowiem ( ͡° ͜ʖ ͡°).
Mam takie kod który dodaje record do bazy (ef w trybie disconnected):
using (var context = new StoreDbContext())
{
using (var transaction = context.Database.BeginTransaction())
{
try
{
context.Customers.Attach(order.Customer);
foreach (var productOrder in order.Products)
{
context.Products.Attach(productOrder.Product);
context.ProductOrders.Add(productOrder);
}
context.Orders.Add(order);
context.SaveChanges();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
throw ex;
}
}
}
Wyjaśnienie: Order zawiera referencje do Customer i listy ProductOrder. Część pogrubioną (petla foreach) sobie darujmy bo tu jest ok. Dodaje do kontekstu (przez Attach) order.Customer bo nie chcę żeby Customer był dodany do bazy jako nowy record - ma to byc referencja do istniejącego recordu.
Problem jest taki, że wywala mi takie błąd na metodzie SaveChanges() :
Czyli próbuje dodać Customer jako nowy record. Dlaczego?
Żeby było śmieszniej to gdy puszcze powyższy kod dwa razy to za drugim razem już zapisze tak jak ma być:
for (int i = 0; i < 2; ++i)
{
using (var context = new StoreDbContext())
{
using (var transaction = context.Database.BeginTransaction())
{
try
{
context.Customers.Attach(order.Customer);
foreach (var productOrder in order.Products)
{
context.Products.Attach(productOrder.Product);
context.ProductOrders.Add(productOrder);
}
context.Orders.Add(order);
context.SaveChanges();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
continue;
throw ex;
}
}
}
}
Czego tylko za pierwszym podejściem próbuje zrobić inserta na Customer a za drugim już zapisuje normalnie?
Pierwszy kawałek kodu:
Komentarz usunięty przez autora
context.Entry(nazwaObiektu).State = EntityState.Modified;
Mam takie kod który dodaje record do bazy (ef w trybie disconnected):
wklejony kod z mojego pierwszego komentarza
Działam w trybie ef disconnected. Mam zdefiniowene Entity o nazwie Order i w nim mam referencje do kolejnego entity Customer.
Gdzieś tam w viewModelu tworze nowy Order (np order = new Order() )
potem przypisuje do niego Customera (np order.Customer =
public virtual Customer Customer;
masz teżpublic int CustomerId
. Jeśli tak jest to przy dodawaniu do contextu nowego Order w polu Customer daj nulla, przypisz CustomerId (które przecież znasz).kombinujesz jak koń pod górkę. Nie wspomne już o tym, ze pomimo jakis 4 lat doswiadczenia z EF nie spotkalem sie ze sformuowaniem "ef disconnected". wtf?
Masz encje A ktora posiada Encje B czy tam wiele encji, masz klucze do nich, czy też pola wirtualne, dodajesz do danej kolekcji (lub przypsiujesz dane cale pole virtualne, albo samo id) a nie robisz jakies atache i inne
Faktycznie teraz chodzi elegancko. Teraz wiem, że wszystkie referencje powinny mieć zdefiniowany też klucz bo bez klucza trzeba się bawić w takie dołanczanie do konktekstu