Korzystamy z EF 5.0 jako naszego ORM-a z wyboru w naszym biznesowym rozwiązaniu, zbudowanym w sposób n-warstwowy, z tym, że wszystko jest oddzielone od siebie i ładnym rootem kompozycji z ninject.Entity Framework 5 nieprawidłowy typ danych w zapytaniu
Ostatnio budowaliśmy bazę danych, która używa partycjonowania pod spodem, i mamy kilka ważnych indeksów na kolumnach DATE
.
Kolumny są poprawnie zadeklarowane na Sql Server 2008. Dodaliśmy również poprawny typ danych w mapowaniach EF, z instrukcją HasColumnType("Date")
.
Nadal, podczas odpytywania tabeli przez Linq do Entities, parametry, od których filtrujemy daty, są tworzone z typu DateTime2
, a nawet kolumny są przesyłane do zapytania DateTime2
w zapytaniach, aby typ odpowiadał parametrom.
To zachowanie ma kilka problemów. Po pierwsze, jeśli mówię silnikowi EF, że kolumna w bazie danych to DATE
, dlaczego ma ją przesłać do DateTime2
?
Po drugie, ta obsada powoduje, że baza danych zignoruje indeksy, a zatem nie używa partycjonowania. Mamy jeden rok na partycjonowanie fizyczne i jeśli zapytam o zakres dat, powiedzmy, luty 2013 do marca 2013, skanowanie powinno odbyć się tylko na jednej partycji fizycznej. Działa poprawnie, jeśli ręcznie używa prawidłowego typu danych: DATE
, ale z rzutowaniem na DateTime2
wszystkie partycje zostaną przeskanowane, co drastycznie obniży wydajność.
Teraz jestem pewien, że czegoś brakuje, ponieważ byłoby dość głupie, że Microsoft ORM nie działa dobrze na Microsoft Sql Server.
Nie mogę znaleźć żadnej dokumentacji dotyczącej sposobu, w jaki EF używa poprawnych typów danych w zapytaniach, więc proszę o to tutaj. Każda pomoc zostanie doceniona.
Dzięki.
Używam leniwego ładowania na tonę właściwości nawigacyjnych. Potrzebowałbym wszystkiego, aby załadować wszystko i ręcznie utworzyć mój wykres obiektów, który jest bardzo złożony i głęboki, więc nie jest to opcja. Może dobrym wyborem będzie przejście na inną ORM jak NHibernate. –
@MatteoMosca - Nie sądzę, że tak jest, chyba że źle zrozumiałem problem. EF pozwala zmaterializować wyniki sp jako * załączone * encje ("śledzone przez kontekst" zgodnie z MSDN), więc powinno działać leniwy ładowanie. Czego nie możesz zrobić, to wspierać * chętny * ładowanie za pomocą tej metody. – Olly
To może być interesujące. Myślę, że tęskniłem za tą funkcją. Przyjrzę się temu jak najszybciej. –