Aktywne Wpisy
alkoJezus +311
I cyk, kolejna majóweczka bez alko ( ͡º ͜ʖ͡º)
Kiedyś to było dla mnie nie do pomyślenia, jak to kiełbaska bez piwa? Przecież to bez sensu
A jednak, da się
Terapia zmienia bardzo wiele, sposób myślenia, schematy którymi podążałem przez lata. Nie dogadałbym się z sobą z przed 10 lat, mam wrażenie że byłem kimś innym, byłem alkusem.
Teraz też nim jestem tylko na sucho. Życie alkoholika
Kiedyś to było dla mnie nie do pomyślenia, jak to kiełbaska bez piwa? Przecież to bez sensu
A jednak, da się
Terapia zmienia bardzo wiele, sposób myślenia, schematy którymi podążałem przez lata. Nie dogadałbym się z sobą z przed 10 lat, mam wrażenie że byłem kimś innym, byłem alkusem.
Teraz też nim jestem tylko na sucho. Życie alkoholika
koala667 +117
Widzę że moda z Chin dotarła już do nas, jak miasto może wydawać zezwolenia na budowę czegoś takiego? (╥﹏╥)
#nieruchomosci #budownictwo #deweloperka #polska #patodeweloperka
#nieruchomosci #budownictwo #deweloperka #polska #patodeweloperka
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
Wyjaśnienie: Order zawiera referencje do Customer i listy ProductOrder. Petle foreach sobie darujmy bo tu jest ok. Dodaje do kontekstu (przez Attach) order.Customer bo nie chcę żeby
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 = selectedCusomter).
no i chce zapisać mój nowy order. Ponieważ działam w trybie disconnected to robie:
- oczywiscie otwieram nowy context i w tym contekście
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). Wtedykombinujesz 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 cuda.
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 albo zmieniane