2015-12-24 5 views
8

Когда я добавляю дополнительные свойства в автогенерированный класс EF с помощью дополнительного частичного класса, эти свойства не заполняются или не заполняются при выполнении запросов к базе данных.Дополнительные свойства Entity Framework не заполняются DbContext.Database.SqlQuery

Пример:

Авто-Generated класс Person:

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

Мой собственный частичный класс

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

Когда я сделать следующий запрос:

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

и использование

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

Идентификатор, FirstName и LastName заполнены, но не DisplayName.

Однако, когда я создаю новый класс под названием 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; } 
} 

И запустить тот же запрос с типом MyPerson отображаемое_имя заселен, а также.

Может кто-нибудь объяснить это или сказать мне, как я могу исправить эту проблему, поэтому я могу использовать Partials вместо создания новых классов/типов.

Скачать пример: https://www.dropbox.com/s/dayrv0jzuoju9q3/StackOverflow_EF_ExtraProperties.zip?dl=0

UPDATE 2015-12-28: При чтении через другие StackOverflow и форумах Codeproject я нашел другие способы, чтобы заставить его работать:

1) Использование TypeBuilder (http://www.codeproject.com/Articles/206416/Use-dynamic-type-in-Entity-Framework-SqlQuery), но из-за всех видов зависимостей проекта у меня были проблемы с поиском уже созданных типов, а не с раздуванием памяти;

2) Лучший вариант до сих пор: использование наследования.

Когда я создаю еще один класс именно с этой линией:

class Person_Reflect : Person { } 

я могу использовать следующий код (он будет игнорировать отображение в файл и использование отражения EDMX:

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

ARE YOU уверен, что второй частичный класс «Лицо» находится в правильном пространстве имен? –

+0

И не исключение, так как вы изменили модель? – dotctor

+0

Вы видите DisplayName как свойство без значения? –

ответ

0

попытки удалить *

@" 
SELECT 
    Id 
    ,FirstName 
    ,LastName 
    ,(FirstName + ' ' + LastName) AS DisplayName 
FROM [Person]" 

В качестве альтернативы вы можете сделать это код ... и тогда вы не захотите необходимо включить его в сыром SQL

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

Оставляя *, не работает, это даже делает его хуже; если я забыл один столбец, приложение заканчивается исключением: Устройство чтения данных несовместимо с указанным «Application.Person». Член типа «COLUMNNAME» не имеет соответствующего столбца в считывателе данных с тем же именем. Вы абсолютно правы, ваше решение для кодирования решает этот пример, но у меня есть динамический запрос, который можно обогатить во время выполнения, чтобы создать множество вариантов конечного пользователя, как отображать/форматировать результаты. Поэтому у меня есть только варианты просмотра: использование evals или создание динамических запросов. –

+0

он должен работать ... столбец должен быть одним и тем же CASE и типом данных. Я сделал что-то само собой разумеющееся, поэтому знаю, что это работает .. пожалуйста, дважды проверьте чехол и типы – Seabizkit

+0

Уважаемый Seabizkit. Я загрузил тестовый пример, в котором я не могу заставить его работать над тем, что вы сделали. Ссылка на полный пример: https://www.dropbox.com/s/dayrv0jzuoju9q3/StackOverflow_EF_ExtraProperties.zip?dl=0 –

1

Лучшего вариант до сих пор без кода много и или делать много проверки коды при изменении базы данных происходит заключается в использовании наследования.

Когда я создаю еще один класс только с этой линией:

class Person_Reflect : Person { } 

я могу использовать следующий код (он будет игнорировать отображение в файл и использование отражения EDMX):

List<EF.Person> listPerson = dbEntities.Database.SqlQuery<EF.Person_Reflect>(sql, new object[] { }).ToList<EF.Person>(); 
Смежные вопросы