Entity Framework Core 3: извлечение данных из нескольких источников с помощью объединения - PullRequest
0 голосов
/ 07 января 2020

У меня есть три таблицы, которые мне нужны для запроса информации, чтобы получить PersonNotes. Я использую Entity Framwork Core 3.

Person Table
PersonNote Table
PersonNoteAttachment Table

У одного человека может быть много персон, а в одной персоне может быть много PersonNoteAttachment.

Мне нужна таблица Person для получения сопоставленных FirstName и LastName, которые сопоставлены. AuthorName в модели данных пользователя PersonNote. Вы можете увидеть раздел сопоставления, в котором показано сопоставление.

DataModels

namespace Genistar.Organisation.Models.DataModels
{

    [Table(nameof(PersonNote), Schema = "common")]
    public class PersonNote
    {
        public int Id { get; set; }
        public int PersonId { get; set; }

        [ForeignKey("PersonId")]
        public Person Person { get; set; }
        public string Note { get; set; }

        public int AuthorId { get; set; }

        [ForeignKey("AuthorId")]
        public Person Author { get; set; }

        public string CreatedBy { get; set; }
        public DateTime Created { get; set; }
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public DateTime RecordStartDateTime { get; set; }
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public DateTime RecordEndDateTime { get; set; }
    }
}

namespace Genistar.Organisation.Models.DataModels
{

    [Table(nameof(PersonNoteAttachment), Schema = "common")]
    public class PersonNoteAttachment
    {
        public int Id { get; set; }

        public int PersonNoteId { get; set; }

        [ForeignKey("PersonNoteId")]
        public PersonNote PersonNote { get; set; }

        public string Alias { get; set; }

        public string FileName { get; set; }

        public string MimeType { get; set; }

        public int Deleted { get; set; }

        public string CreatedBy { get; set; }
        public DateTime Created { get; set; }
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public DateTime RecordStartDateTime { get; set; }
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public DateTime RecordEndDateTime { get; set; }
    }
}

Модель пользователя - это модель, которую я возвращаю клиентскому приложению

namespace Genistar.Organisation.Models.User
{
    [Table(nameof(PersonNote), Schema = "common")]
    public class PersonNote
    {
        public int Id { get; set; }
        public int PersonId { get; set; }
        public string Note { get; set; }
        public int AuthorId { get; set; }
        public string AuthorName { get; set; }
        public string CreatedBy { get; set; }
        public DateTime Created { get; set; }
    }
}

Mapping

CreateMap<Genistar.Organisation.Models.DataModels.PersonNote, Genistar.Organisation.Models.User.PersonNote>()
                  .ForMember(t => t.Id, opt => opt.MapFrom(s => s.Id))
                  .ForMember(t => t.PersonId, opt => opt.MapFrom(s => s.PersonId))
                  .ForMember(t => t.AuthorName, opt => opt.MapFrom(s => s.Author.FirstName + " " + s.Author.LastName))
                  .ForMember(t => t.Note, opt => opt.MapFrom(s => s.Note))
                  .ForMember(t => t.AuthorId, opt => opt.MapFrom(s => s.AuthorId))
                  .ForMember(t => t.CreatedBy, opt => opt.MapFrom(s => s.CreatedBy))
                  .ForMember(t => t.Created, opt => opt.MapFrom(s => s.Created));

Следующий запрос работает, но получает только данные из таблицы Person и PersonNote. Я также рассчитываю на получение PersonNoteAttachment. Как я могу это сделать ? Мне в основном нужно поле FileName & MimeType, заполненное в модели User.PersonNote. Если вы видите выше, я создал модель данных PersonNoteAttachment

Репозиторий

public IQueryable<PersonNote> GetPersonNotes(int personId)
        {
            var personNotes = _context.PersonNotes.Include(x => x.Person).Include(x=> x.Author).Where(p => p.PersonId == personId);
            return personNotes;
        }

API:

 [FunctionName(nameof(GetPersonNote))]
        [UsedImplicitly]
        public Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "person-note/{id}")] HttpRequest req,
            int id) => _helper.HandleAsync(async () =>
        {
            //await _helper.ValidateRequestAsync(req,  SecurityPolicies.ViewNotes);
            var personNotes = await _organisationRepository.GetPersonNotes(id).ProjectTo<PersonNote>(_mapper.ConfigurationProvider).ToListAsync();
            return new OkObjectResult(personNotes);
        });         

Мой подход состоял в том, чтобы сделать это следующим образом в репозитории. но мне нужно вернуть модель данных PersonNote в хранилище. Я не могу добавить эти дополнительные поля в модель, потому что там указаны недопустимые столбцы. Как мне подойти к этому?

 var personNotes = _context.PersonNotes
                .Include(x => x.Person)
                .Include(x => x.Author)
                .Where(p => p.PersonId == personId)
                .Join(_context.PersonNotesAttachments, c => c.Id, cm => cm.PersonNoteId, (c, cm) => new
                {    
                     cm.PersonNote.Id,
                     cm.PersonNote.PersonId,
                     cm.PersonNote.Person,
                     cm.PersonNote.Note,
                     cm.FileName,
                     cm.MimeType,
                     cm.Alias,
                     cm.PersonNote.AuthorId,
                     cm.PersonNote.CreatedBy,
                     cm.PersonNote.Created
                });

1 Ответ

0 голосов
/ 08 января 2020

Я решил проблему

Мне просто нужно было добавить следующую строку в PersonNote datamodel

 public PersonNoteAttachment PersonNoteAttachment { get; set; }

Добавил новые поля в пользовательскую модель PersonNote и сделал следующее отображение

 .ForMember(t => t.FileName, opt => opt.MapFrom(s => s.PersonNoteAttachment.FileName))
                  .ForMember(t => t.MimeType, opt => opt.MapFrom(s => s.PersonNoteAttachment.MimeType))
                  .ForMember(t => t.Alias, opt => opt.MapFrom(s => s.PersonNoteAttachment.Alias))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...