Temat: Entity Framework + SaveChanges() :/

Mam sobie prostą tabelę: dbo.Test
Pole: TestId( bigint, Not null, Primary, Identity)

Dim t As Test = Test.CreateTest(0)

db.AddToTest(t)
db.SaveChanges()

I kiszka w tabeli nic się nie pojawia. Błędami też nie sypie. Dane wprowadzone ręcznie mogę spokojnie pobierać (LINQ).

Ktoś ma jakiś pomysł? Google zwróciło sensowne odpowiedzi ale w u mnie nie mają zastosowania.

Z góry dzięki.
Łukasz L.

Łukasz L. Programista C# .NET

Temat: Entity Framework + SaveChanges() :/

Witam.

Zamiast

db.AddToTest(t)


spróbuj

db.Test.AddObject(t);


Metody AddToXYZ() są oznaczone jako Deprecated.

Mam nadzieję, że pomoże.Łukasz Lempert edytował(a) ten post dnia 16.04.11 o godzinie 11:13

Temat: Entity Framework + SaveChanges() :/

Łukasz Lempert:
Witam.

Zamiast

db.AddToTest(t)


spróbuj

db.Test.AddObject(t);


Metody AddToXYZ() są oznaczone jako Deprecated.

Mam nadzieję, że pomoże.

Niestety db.AddObject("Test",t) też nie pomogło :( Zaczynam powoli wariować ...
Łukasz L.

Łukasz L. Programista C# .NET

Temat: Entity Framework + SaveChanges() :/

Piotrze, nie chodzi o AddObject() na obiekcie kontekstu, tylko o metodę AddObject na kolekcji obiektów encji. Czyli:

db.Test.AddObject(t);

Przyjmuje ona jeden parametr - obiekt encji.

//edit:
Aczkolwiek sprawdziłem u siebie - działają zarówno metody, których użyłeś jak i ta zaproponowana przeze mnie. Tak więc problem nie znajduje się w przedstawionym miejscu.Łukasz Lempert edytował(a) ten post dnia 16.04.11 o godzinie 14:36

Temat: Entity Framework + SaveChanges() :/

Łukasz Lempert:
Piotrze, nie chodzi o AddObject() na obiekcie kontekstu, tylko o metodę AddObject na kolekcji obiektów encji. Czyli:

db.Test.AddObject(t);

Przyjmuje ona jeden parametr - obiekt encji.

//edit:
Aczkolwiek sprawdziłem u siebie - działają zarówno metody, których użyłeś jak i ta zaproponowana przeze mnie. Tak więc problem nie znajduje się w przedstawionym miejscu.

Wykorzystałem tą z kontekstu ponieważ u mnie w żadnej encji AddObject nie ma.

BTW: Ja korzystam z VS2008 i .NET 3.5 (wymóg klienta)Piotr Rusoł edytował(a) ten post dnia 16.04.11 o godzinie 14:47

konto usunięte

Temat: Entity Framework + SaveChanges() :/

Piotr Rusoł:
Mam sobie prostą tabelę: dbo.Test
Pole: TestId( bigint, Not null, Primary, Identity)

Dim t As Test = Test.CreateTest(0)

db.AddToTest(t)
db.SaveChanges()

I kiszka w tabeli nic się nie pojawia. Błędami też nie sypie. Dane wprowadzone ręcznie mogę spokojnie pobierać (LINQ).

Ktoś ma jakiś pomysł? Google zwróciło sensowne odpowiedzi ale w u mnie nie mają zastosowania.

Z góry dzięki.

Masz tylko jedno pole w tej tabeli?

Jakiego polecenia sql używasz do ręcznego wstawienia rekordu? Bo jesli to jest to identity to sql nie pozwoli ci wstawić tam zera z palca ;). Zastanawiające że EF nie rzuca wyjątkiem jesli to jest to, ale tak tylko gdybam...

Temat: Entity Framework + SaveChanges() :/

Marcinu B.:
Piotr Rusoł:
Mam sobie prostą tabelę: dbo.Test
Pole: TestId( bigint, Not null, Primary, Identity)

Dim t As Test = Test.CreateTest(0)

db.AddToTest(t)
db.SaveChanges()

I kiszka w tabeli nic się nie pojawia. Błędami też nie sypie. Dane wprowadzone ręcznie mogę spokojnie pobierać (LINQ).

Ktoś ma jakiś pomysł? Google zwróciło sensowne odpowiedzi ale w u mnie nie mają zastosowania.

Z góry dzięki.

Masz tylko jedno pole w tej tabeli?

Jakiego polecenia sql używasz do ręcznego wstawienia rekordu? Bo jesli to jest to identity to sql nie pozwoli ci wstawić tam zera z palca ;). Zastanawiające że EF nie rzuca wyjątkiem jesli to jest to, ale tak tylko gdybam...

Korzystam z Database Explorer (z wygody).

Dorzuciłem sobie dla wszystkiego jeszcze pole Name:varchar(50) (zrobiłem update modelu) ale dalej to samo. Niby obiekt jest. Niby się dodał do kontekstu i niby się zaspisuje ale w bazie go nie widać. To samo dzieje się
pod VS2010. Zaczynam powoli popadać w paranoję i myśleć, że VS2008 gryzie się z VS2010.Piotr Rusoł edytował(a) ten post dnia 16.04.11 o godzinie 15:39

konto usunięte

Temat: Entity Framework + SaveChanges() :/

Korzystam z Database Explorer (z wygody).

Dorzuciłem sobie dla wszystkiego jeszcze pole Name:varchar(50) (zrobiłem update modelu) ale dalej to samo. Niby obiekt jest. Niby się dodał do kontekstu i niby się zaspisuje ale w bazie go nie widać. To samo dzieje się
pod VS2010. Zaczynam powoli popadać w paranoję i myśleć, że VS2008 gryzie się z VS2010.

Spróbowałem u siebie i wygląda że działa aczkolwiek ja nie mam w encji metody CreateTest. Stworzyłem sobie obiekt Test przez zwykły konstruktor. I działa nawet jak nie ustawie ID na 0.
Tabela:

CREATE TABLE [dbo].[Test](
[TestID] [bigint] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[TestID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Kodzik (C# co prawda ale chyba róznicy nie robi ;) ):

TestDBEntities db = new TestDBEntities();
Test test = new Test();
//test.TestID = 0;
test.Name = "lorem ipsum";
db.AddToTest(test);
db.SaveChanges();

Temat: Entity Framework + SaveChanges() :/

Marcinu B.:
Korzystam z Database Explorer (z wygody).

Dorzuciłem sobie dla wszystkiego jeszcze pole Name:varchar(50) (zrobiłem update modelu) ale dalej to samo. Niby obiekt jest. Niby się dodał do kontekstu i niby się zaspisuje ale w bazie go nie widać. To samo dzieje się
pod VS2010. Zaczynam powoli popadać w paranoję i myśleć, że VS2008 gryzie się z VS2010.

Spróbowałem u siebie i wygląda że działa aczkolwiek ja nie mam w encji metody CreateTest. Stworzyłem sobie obiekt Test przez zwykły konstruktor. I działa nawet jak nie ustawie ID na 0.
Tabela:

CREATE TABLE [dbo].[Test](
[TestID] [bigint] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[TestID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Kodzik (C# co prawda ale chyba róznicy nie robi ;) ):

TestDBEntities db = new TestDBEntities();
Test test = new Test();
//test.TestID = 0;
test.Name = "lorem ipsum";
db.AddToTest(test);
db.SaveChanges();

Tą drogę też już w między czasie sprawdziłem - efekt bez zmian :(
Albo mam gdzieś źle jakąś pierdołę albo to coś grubszego bo wierzyć mi się nie chce, że jestem rodzynkiem u którego nie działa. :/

Temat zostawiam otwarty jak by się ktoś trafił z podobny problemem i/lub rozwiązaniem a Panowie dostajecie po plusie za wykazane zainteresowanie i pomoc w diagnozie, że to po mojej stronie na 100% jest problem.Piotr Rusoł edytował(a) ten post dnia 16.04.11 o godzinie 18:38

konto usunięte

Temat: Entity Framework + SaveChanges() :/

A może problem jest tu:
Dim t As Test = Test.CreateTest(0);

Temat: Entity Framework + SaveChanges() :/

No to mam już pierwszą wskazówkę.

Zrobiłem nowy projekt pod VS2008.
W SQL Manager stworzyłem nową bazę i ją odpiołem.
Pod VS08 dodałem Model i jednocześnie przypiołem się do bazy.
Raptem bangla ?????? <młotek><głowa><podłoga> ;)

Różnica polega na tym, że w niedziałającym przypadku baza była utworzona z poziomu VS08. Co ciekawsze EF wykładał się też gdy baza była utworzona z poziomu VS10. Teraz nasuwa się pytanie czy to ja źle robiłem, że bazę tworzyłem z poziomu VS czy może jest jakiś BUG, którego jeszcze nikt nie wychwycił i załatał?Piotr Rusoł edytował(a) ten post dnia 16.04.11 o godzinie 20:45
Adam K.

Adam K. Dyrektor IT, Benefit
Systems
International Sp. z
o.o.

Temat: Entity Framework + SaveChanges() :/

1. Debuger - prześledź co i jak się wywołuje, krok po kroku
2. Przed SaveChanges() zobacz jaki masz connection string: db.Connection.ConnectionString 3. Jeżeli wszystko jest z nim ok, to przed puszczeniem SaveChanges profiler na bazie i zobacz jakie idą zapytania i czy się na niej pojawiają.

Wygląda to tak jakby w kontekście nie było zmian, więc SaveChanges nic nie robi.

Temat: Entity Framework + SaveChanges() :/

Adam Kozłowski:
1. Debuger - prześledź co i jak się wywołuje, krok po kroku
2. Przed SaveChanges() zobacz jaki masz connection string: db.Connection.ConnectionString 3. Jeżeli wszystko jest z nim ok, to przed puszczeniem SaveChanges profiler na bazie i zobacz jakie idą zapytania i czy się na niej pojawiają.

Wygląda to tak jakby w kontekście nie było zmian, więc SaveChanges nic nie robi.

Z ostatniej chwili, nowy działający projekt znów się rozsypał tylko w inny sposób. Mianowicie w pewnej chwili VS08 nie chciało mi zapisać zmian w diagramie bazy sypiąc komunikatem, że relacja jaką chcę wprowadzić narusza ograniczenie, które wprowadziła inna relacja. Z tym, że ta blokująca relacja nie pojawiała się na diagramie. Pomogło dopiero fizyczne usunięcie tych dwóch tabel z poziomu SQL Management Studio 2008 i odtworzenie ich krok po kroku. Po tej operacji automatycznie pojawiła się ta zgubiona relacja.

Na tą chwilę przychodzi mi do głowy tylko jeden morał. Projektowanie bazy przy użyciu bezpośrednio Visual Studio to proszenie się o kłopoty.

Stary projekt zostawiłem jako case do analizy właśnie pod profilerem. Przypadek jest o tyle ciakawy, że zmiana typu i/lub usunięcie atrybutu w bazie bez uaktualnienia modelu ładnie sypało wyjątkiem.

konto usunięte

Temat: Entity Framework + SaveChanges() :/

Piotr Rusoł:
Na tą chwilę przychodzi mi do głowy tylko jeden morał. Projektowanie bazy przy użyciu bezpośrednio Visual Studio to proszenie się o kłopoty.

Zgadza się. Rozszerzę twoje stwierdzenie mówiąc że wybór Entity Framework to proszenie się o kłopoty i nerwy.

Musisz zdekompilować EF i prześledzić call tree bo inaczej to tylko przypuszczenia ale zakładam że jest to problem w tym co generator modelu w EF generuje.
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Entity Framework + SaveChanges() :/

Bartosz Adamczewski:
Zgadza się. Rozszerzę twoje stwierdzenie mówiąc że wybór Entity Framework to proszenie się o kłopoty i nerwy.

Tu nasuwa się mi pytanie - czy programiści z Microsoft są faktycznie tacy ciency, że korzystanie z EF to proszenie się o kłopoty i nerwy, czy po prostu ktoś boi się fanatycznie czegoś nowego? Odwieczny problem...

konto usunięte

Temat: Entity Framework + SaveChanges() :/

Używałem EF w dużym projekcie, nie sprawdził się co wielokrotnie opisywałem na łamach tego forum, więc jak można nazwać to strachem przed czymś nowym? :-)

EF w porównaniu z innymi ORMami, czy z własnym rozwiązaniem wypada po prostu słabo :-), wiem bo w wielu programowałem i kilka samemu napisałem.

Jeśli faktycznie chcesz spróbować czegoś nowego to wyjdź z technologii i zajmij się platformami i spróbuj Javy, Rubego, Pythona a jeśli jesteś naprawdę odważny i chcesz się rozwijać to OCaml, Factor. Siedząc w jednym stosie technologicznym i jednej platformie zawężasz znacznie swój punkt widzenia.

Będziesz potem mógł mi powiedzieć dlaczego wybrałeś C# ale też powiedzieć co jest kiepskie w porównaniu z konkurencją.
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Entity Framework + SaveChanges() :/

Dlatego też pytałem. Ostatnio się interesuję EF. Możesz podać linki do tematów, w których opisywałeś te problemy z EF?

Wydaje mi się jednak, że do małych projektów jest wystarczająco dobre (plus wygoda użycia, bo wraz z Visual Studio + dobra integracja tej technologii z VS)

konto usunięte

Temat: Entity Framework + SaveChanges() :/

Borysław Bobulski:
Dlatego też pytałem. Ostatnio się interesuję EF. Możesz podać linki do tematów, w których opisywałeś te problemy z EF?

tutaj

i tutaj

Gdzieś jeszcze się na ten temat rozpisywałem ale nie mogę znaleźć.

Co do EF to na pewno nadaje się do małych projektów ale jest to dziwne bo MS promuje to rozwiązanie jako platformę Enterprise. Po wersji pierwszej były petycje i w wersji drugiej trochę problemów zostało rozwiązanych lecz nie wszystkie. Główny Architekt tego rozwiązania nie widzi wielkiego słonia którym jest wydajność i zapytany na konferencji poświęconej EF 2.0 przez kogoś:

"A jak z wydajnością?" odpowiedział "Przecież wydajność jest dobra, nie musimy jej poprawiać".

Ale jeśli będzie ci się chciało to sprawdź ten aspekt wydajnościowy samemu, szczególnie zwróć uwagę na model w którym masz > 10 tabel z dużą ilością pól.

Kolejny przypadek to dwa modele i join pomiędzy na tabelach pomiędzy modelami.
Łukasz L.

Łukasz L. Programista C# .NET

Temat: Entity Framework + SaveChanges() :/

Pierwsza wersja EF faktycznie miała sporo niedociągnięć, aż dziwne, że nie była oznaczona jako jakaś Beta.

W obecnej natomiast uważam, że nie jest źle. Oczywiście nie wprowadza nic na tyle innawacyjnego czy lepszego od innych, aby należało w ciemno go wybierać. Ale jest na pewno jakimś konkurentem dla NH i warto brać go pod uwagę. Osobiście uważam, że bardzo ładnie współpracuje z POCO oraz WCF.

Pisanie własnych ORM na pewno daje maksymalną elastyczność ale to bardzo duży koszt nie zawsze budżet jest w stanie to uciągnąć. Tym bardziej jeśli takowy ma być re-usable.

konto usunięte

Temat: Entity Framework + SaveChanges() :/

Bartosz Adamczewski:

Bartosz EF 2.0 ? :) Na dzień dzisiejszy jest 4.1 + Code First. Ja po pierwszym projekcie z EF41CF jestem pod dużym wrażeniem. Niesamowita prostota + siła LINQ = błyskawicznie napisany DAL. Argument o prędkości EF vs. NH, LLBLgen czy inny XXX trzeba rozpatrywać w szerszym kontekście. Co z tego, że NH jest szybsze jeżeli ma zbyt skomplikowany model zapytań i słabiutką dokumentację. Dla zatwardziałych fanatyków prędkości zostaje zawsze gołe zapytanie T-SQL do bazy w EF:


context.Database.SqlQuery<Person>("SELECT...") // beat that NH


Nie twierdze, że to super rozwiązanie, jednak jeżeli mam do wyboru taki SELECT i dłuuugie godziny spędzone na budowaniu DetachedCriteria i innych Futuresów w NH to wybieram to pierwsze. Jak to ktoś kiedyś ładnie powiedział "programowanie to sztuka kompromisu" ;)Jarosław D. edytował(a) ten post dnia 20.04.11 o godzinie 09:57

Następna dyskusja:

Table Valued Functions in E...




Wyślij zaproszenie do