Данные из 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 шт):

Автор решения: A K

Есть хорошая практика передавать в модели простые типы int/string/DateTime/bool, а вот когда модель состоит из объектов базы данных -- это грубая архитектурная ошибка, особенно когда детали реализации базы просачиваются не только в соседний слой, но и проходят через всё приложение и видны "снаружи" приложения (скажем, вебапи).

Рванёт ли подобная мина замедленного действия -- это как повезёт, но я вполне помню, что в ряде случаев лень было делать тщательно и наткнулся на ошибку что json.net отдавая подобные модели наружу отказывался их сериализовывать из-за циклических ссылок в графе объектов.

Ваш MessageText - прекрасная классическая DTO'ошка! Оставьте в таком виде, она отлично подходит под свою задачу: передать данные от одного слоя приложения к другому.

→ Ссылка