Данные из storage procedure в модель DBContext
Помогите, пожалуйста. С С# сталкивалась мало, а с entity framework впервые. Есть модель содержащая данные из разных таблиц.
public class Message
{
[DataMember(Order = 1)]
public int Id { get; set; }
[DataMember(Order = 2)]
public string Number { get; set; }
[DataMember(Order = 3)]
public UserInfo Sender { get; set; }
[DataMember(Order = 4)]
public List<UserInfo> Recipients { get; set; }
}
public class UserInfo
{
[DataMember(Order = 1)]
public string Login { get; set; }
[DataMember(Order = 2)]
public string Name { get; set; }
[DataMember(Order = 3)]
public string CompanyName { get; set; }
}
Мне нужно в SP! получить данные и передать в Message, к сожалению все примеры какие нашла на modelContext.Database.SqlQuery описывают одну таблицу.
modelContext.Database.SqlQuery<Message> Передает данные в простые поля, но Sender и Recipients остаются не заполнены. (Recipients для данного запроса всегда один на Messag.Id )
Пробовала записать сначала modelContext.Database.SqlQuery ,где в Test все поля простых типов
public class MessageTest
{
public int Id { get; set; }
public string Number { get; set; }
public string SenderLogin { get; set; }
public string SenderName { get; set; }
public string SenderCompanyName { get; set; }
...
}
В такую модель все данные возвращаются. А как сразу в Message? Нужно именно через SP не через Linq!
Ответы (1 шт):
Есть хорошая практика передавать в модели простые типы int/string/DateTime/bool, а вот когда модель состоит из объектов базы данных -- это грубая архитектурная ошибка, особенно когда детали реализации базы просачиваются не только в соседний слой, но и проходят через всё приложение и видны "снаружи" приложения (скажем, вебапи).
Рванёт ли подобная мина замедленного действия -- это как повезёт, но я вполне помню, что в ряде случаев лень было делать тщательно и наткнулся на ошибку что json.net отдавая подобные модели наружу отказывался их сериализовывать из-за циклических ссылок в графе объектов.
Ваш MessageText - прекрасная классическая DTO'ошка! Оставьте в таком виде, она отлично подходит под свою задачу: передать данные от одного слоя приложения к другому.