C # viewmodel: model -> Не удается заставить работать с типизацией - PullRequest
0 голосов
/ 28 февраля 2011

Я создаю модель linq-to-sql с EF, и у меня есть класс, который работает хорошо, однако я хочу иметь возможность добавлять дополнения к классу и не перезаписывать их при внесении изменений в EF, поэтому Я считаю, что мне нужно использовать второй слой класса представления.

Итак, у меня есть:

public partial class People: INotifyPropertyChanging, INotifyPropertyChanged {...} // created by EF

тогда хотите сделать:

public partial class ViewPeople: People {
   public String someFunction() {...} // additional functionality
}

однако, когда я пытаюсь привести из People в ViewPeople, используя код ниже, я получаю исключение:

Невозможно привести объект типа «Namespace.Models.People» к «Namespace.Models.ViewPeople»

Код:

//select the person
NSDataContext dc = new NSDataContext(); // to get to the data context and models froM EF
var person = (from p in dc.Peoples where p.id == personID select p).First();

// pass model to view
return View((ViewPeople)person)

Если я просто прохожу через человека, я получаю доступ ко всем свойствам и методам "Люди" Когда я изменяю класс ViewPeople, я получаю доступ ко всем свойствам и методам суперкласса «Люди» при обращении к «this».

Конечно, это что-то простое, но я просто не могу понять!

Буду признателен за любую помощь в этом вопросе, как пример того, где кто-то внедрил модели представления поверх автоматически генерируемых моделей EF!

Заранее спасибо, Andrew

Ответы [ 2 ]

2 голосов
/ 28 февраля 2011

Если вы получаете People от EF, вы не можете волшебным образом преобразовать его в ViewPeople.
Вы можете привести объект к ViewPeople, только если он на самом деле равен a ViewPeople.

Вместо этого вам нужно дать ViewPeople конструктор, который принимает People и копирует его свойства.

1 голос
/ 28 февраля 2011

Когда платформа сущностей возвращает объекты из данных, которые она выбирает из базы данных, она создает People, а не ViewPeople. Это объясняет, почему вы не можете разыграть свои объекты. Если вы хотите добавить функциональность в свой класс People, вы можете добавить это в другой файл в той же сборке:

public partial class People
{
    public String someFunction() {...} // additional functionality
}

Другая вещь, которую вы можете сделать, это заставить класс ViewPeople взять экземпляр People в своем конструкторе, обернуть свойства экземпляра People (yikes!) И изменить свой запрос на:

//select the person
NSDataContext dc = new NSDataContext(); // to get to the data context and models froM EF
ViewPeople person = (from p in dc.Peoples where p.id == personID select new ViewPeople(p)).First();

// pass model to view
return View(person)
...