2016-08-19 3 views
0

Я пытаюсь реализовать приложение MVC без Entity Framework, вместо этого я использую datatables для заполнения моих бизнес-объектов, но у меня много вопросов.MVC pattern без Entity Framework

Предположим, что у меня есть этот простой clasess:

public class Person { 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class Phone { 
    public int Id { get; set; } 
    public string PhoneNumber { get; set; } 
    public int PersonId { get; set; } 
} 

Если бы я использовал EF, Person класс должен иметь свойство навигации, чтобы получить телефоны и класс телефон должен иметь свойство навигации к человеку. Так что если я должен был отобразить список Person с телефонами, результат SQL должен выглядеть следующим образом:

------------------------------------------------------------ 
| **PersonId** |**Name** | **PhoneId** | **PhoneNumber** | 
------------------------------------------------------------ 
|    1 | John Doe |   1 | 111-55-5855  | 
------------------------------------------------------------ 
|    1 | John Doe |   2 | 111-55-5521  | 
------------------------------------------------------------ 
|    2 | Mary Jane|   3 | 254-565-855  | 
------------------------------------------------------------ 
|    3 | J. Watson|   NULL|    NULL| 
------------------------------------------------------------ 

До сих пор, что я сделал это:

На мой взгляд, я должен показать контакты в этом формате:

------------------------------------------------------------ 
|**Name** | ** Phones **        | 
------------------------------------------------------------ 
| John Doe | 111-55-5855, 111-55-5521     | 
------------------------------------------------------------ 
| Mary Jane| 254-565-855         | 
------------------------------------------------------------ 
| J. Watson| -           | 
------------------------------------------------------------ 

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

public class PersonForList { 
    public int PersonId { get; set; } 
    public string PersonName { get; set; } 
    public int PhoneId { get; set; } 
    public string PhoneNumber { get; set; } 
} 

У меня есть PersonManager с этим методом:

public List<PersonForList> GetPeopleWithPhones { 
    List<PersonForList> people = new List<PersonForList>(); 
    SqlCommand command = new Command(query); 
    var dt = ExecuteDataTable(command); 

    foreach(DataRow row in dt.Rows){ 
     var person = new PersonForList() { 
      ... Fill object 
      PersonId = (int)row["PersonId"], 
      ... 
     } 
     people.Add(person); 
    } 
    return people; 
} 

И наконец, мой ViewModel:

public class PersonListViewModel { 
    public int PersonId { get; set; } 
    public string PersonName { get; set; } 
    public string Phones { get; set; } 
} 

(Если вы действительно зашли так далеко, вы должны быть на самом деле пациент = S)

Вопросы:

Если мне нужно разбивать страницы на список, как я могу подсчитать разные записи, но все еще есть все телефоны в моем запросе? ... Например, если размер страницы был 3, с моим текущим запросом я получаю только Джон Доу и Мэри Jane Phones, потому что это 3 строки, но не для другого человека.

Как я могу заполнить модель моего вида? Я не знаю, как перебирать список, чтобы получить одного человека со всеми его телефонами.

Является ли мой класс PersonForList действительно необходимым?

Как-то это поведение платформы Entity Framework, и я просто пытаюсь подражать, чтобы получить данные с минимальным количеством запросов.

Я старался быть очень конкретным и держать вопрос коротким, но если вам нужно больше деталей, я могу предоставить вам.

+0

лучше задать вопрос в более чем одном сообщении. Во-первых, почему вы не хотите использовать EF? для данных подкачки зависит от того, какую версию SQL-сервера вы используете, например, вы можете использовать OFFSET в SQL 2014 и Row_number в другой версии. –

+0

В моей книге PersonForList не требуется. Я думаю, вы можете сделать это лучше, когда EF установил ваш запрос. –

+0

В моей работе мы используем наш собственный ORM, но на самом деле не поддерживаем поддержку Joins, поэтому, когда нужны Joins, нам нужно сделать необработанные запросы, а затем отобразить результаты вручную. Я использую SQL Server 2014. –

ответ

0

Для сопоставления данных с одного объекта на другой, я бы использовал AutoMapper, другие инструменты доступны.

Но я согласен со всеми, используйте ORM, это сделает вашу жизнь на 32% счастливее.