Я пытаюсь реализовать приложение 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, и я просто пытаюсь подражать, чтобы получить данные с минимальным количеством запросов.
Я старался быть очень конкретным и держать вопрос коротким, но если вам нужно больше деталей, я могу предоставить вам.
лучше задать вопрос в более чем одном сообщении. Во-первых, почему вы не хотите использовать EF? для данных подкачки зависит от того, какую версию SQL-сервера вы используете, например, вы можете использовать OFFSET в SQL 2014 и Row_number в другой версии. –
В моей книге PersonForList не требуется. Я думаю, вы можете сделать это лучше, когда EF установил ваш запрос. –
В моей работе мы используем наш собственный ORM, но на самом деле не поддерживаем поддержку Joins, поэтому, когда нужны Joins, нам нужно сделать необработанные запросы, а затем отобразить результаты вручную. Я использую SQL Server 2014. –