2015-12-24 13 views
8

Po dodaniu dodatkowych właściwości do automatycznie wygenerowanej klasy EF za pomocą dodatkowej częściowej klasy, właściwości te nie są wypełniane lub wypełniane podczas uruchamiania zapytań w bazie danych.Dodatkowe właściwości Entity Framework nie są zapełniane przez DbContext.Database.SqlQuery

Przykład:

Auto-Generated class Person:

public partial class Person 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

Moja własna klasa częściowe

public partial class Person 
{ 
    public string DisplayName{ get; set; } 
} 

Kiedy wprowadzić następujące zapytanie:

"SELECT *, (FirstName + LastName) AS DisplayName FROM [Person]" 

i wykorzystania

DbContext.Database.SqlQuery(typePerson, SQL, null) 

Identyfikator, imię i nazwisko są wypełnione, ale nie nazwa wyświetlana.

Jednak gdy tworzę zupełnie nową klasę o nazwie MyPerson

public partial class MyPerson 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string DisplayName{ get; set; } 
} 

i uruchomić tę samą kwerendę z rodzaju MyPerson DisplayName jest zaludnionych, jak również.

Czy ktoś może wyjaśnić to lub powiedz mi, jak mogę rozwiązać ten problem, aby można było używać częściowe zamiast tworzenia nowych klas/typów.

Pobierz przykład: https://www.dropbox.com/s/dayrv0jzuoju9q3/StackOverflow_EF_ExtraProperties.zip?dl=0

UPDATE 28.12.2015: Podczas czytania przez innych stackoverflow i forach codeproject znalazłem innego sposobu, aby zmusić go do pracy:

1) Korzystanie Typebuilder (http://www.codeproject.com/Articles/206416/Use-dynamic-type-in-Entity-Framework-SqlQuery), ale z powodu różnych zależności projektu miałem problemy ze znalezieniem już utworzonych typów i nie wysadzenie pamięci;

2) Najlepsza opcja do tej pory: wykorzystanie dziedziczenia.

Kiedy utworzyć inną klasę z właśnie to linie:

class Person_Reflect : Person { } 

mogę użyć następującego kodu (będzie ignorować mapowanie w EDMX akt i wykorzystanie refleksji:

List<EF.Person> listPerson = dbEntities.Database.SqlQuery<EF.Person_Reflect>(sql, new object[] { }).ToList<EF.Person>(); 
+3

Czy jesteś czy druga klasa cząstkowa "Osoby" znajduje się we właściwej przestrzeni nazw? –

+0

I nie ma wyjątku, ponieważ zmieniłeś model? – dotctor

+0

Czy widzisz DisplayName jako właściwość bez wartości? –

Odpowiedz

0

spróbować ZLIKW Alternatywnie możesz zrobić to kod ... a potem nie zrobiłbyś tego trzeba umieścić go w swojej surowej sql

public string DisplayName { get { return FirstName+ " " +LastName ; } } 
+0

Pozostawienie znaku * nie działa, nawet go pogarsza; jeśli zapomnę jedną kolumnę, aplikacja kończy się z wyjątkiem: Czytnik danych jest niekompatybilny z określonym "Application.Person". Element typu "COLUMNNAME" nie ma odpowiedniej kolumny w czytniku danych o tej samej nazwie. Masz całkowitą rację, twoje rozwiązanie do kodowania rozwiązuje ten przykład, ale mam zapytanie dynamiczne, które można wzbogacić w środowisku wykonawczym, aby stworzyć wiele opcji dla użytkowników końcowych, jak wyświetlać/formatować wyniki. Więc mam tylko opcje widoku: używanie evals lub tworzenie dynamicznych zapytań. –

+0

powinien działać ... kolumna musi być taki sam CASE i typ danych. Zrobiłem coś podobnego, więc wiem, że to działa. Proszę sprawdź skrzynkę i typy. – Seabizkit

+0

Drogi Seabizkit. Przesłałem przykład testowy, w którym nie mogę sprawić, by działało to, co osiągnąłeś. Link do pełnego przykładu to: https://www.dropbox.com/s/dayrv0jzuoju9q3/StackOverflow_EF_ExtraProperties.zip?dl=0 –

1

najlepszym rozwiązaniem do tej pory bez konieczności kodowania dużo i czy zrobić dużo przegląd kodu gdy występują zmiany bazy danych jest użycie dziedziczenia.

Kiedy tworzę innej klasy tylko z tej linii:

class Person_Reflect : Person { } 

mogę użyć następującego kodu (będzie ignorować mapowanie w pliku i użyć refleksji EDMX):

List<EF.Person> listPerson = dbEntities.Database.SqlQuery<EF.Person_Reflect>(sql, new object[] { }).ToList<EF.Person>(); 
Powiązane problemy