Как сохранить внешний ключ в dbObject при отображении из DTO -> dbObject? - PullRequest
0 голосов
/ 02 апреля 2020

Когда я пытаюсь обновить мой dbObject Template с подмножеством List<Symbol>, я сопоставляю свой DTO TemplateJS с Template и затем сохраняю его. В свою очередь, подмножество DTO List<SymbolJS> также отображается на List<Symbol>. Тем не менее, во время этого отображения Symbol теряет свою ссылку на Template, потому что мой SymbolJS не содержит FK, потому что ему это не нужно в представлении.

Просто интересно, как должен выглядеть правильный способ сохранения этой ссылки.

Демонстрация: https://dotnetfiddle.net/26WGki

Код ниже работает, но кажется очень неправильно со мной.


public async Task UpdateTemplateAsync(TemplateJS templateJS)
        {
            try
            {
                var dbTemplate = await _dbContext.Template
                                            .Include(x => x.Symbols)
                                        .AsNoTracking()
                                        .Where(x => x.Id == templateJS.Id)
                                        .SingleOrDefaultAsync();
                if (dbTemplate != null)
                {
                    dbTemplate = _mapper.Map<Template>(templateJS);

                    //hoping to not do this
                    dbTemplate.Symbols.ForEach(x => x.TemplateId = templateJS.Id);

                    _dbContext.Update(dbTemplate);
                    await _dbContext.SaveChangesAsync();
                }
                else throw new Exception("Template does not exist");
            }
            catch (Exception e)
            {
                throw e;
            }

        }

Конфигурация AutoMapper

            CreateMap<Template, TemplateJS>()            
            .ReverseMap()                
            ;

            CreateMap<Symbol, SymbolJS>()
            .ReverseMap()
                .ForMember(dest => dest.Template, opt => opt.Ignore());

Модели

public class Template
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<Exercise> Exercises { get; set; }
        public List<Symbol> Symbols { get; set; }
    }

public class Symbol
    {
        public int Id { get; set; }
        public int TemplateId { get; set; }
        public Template Template { get; set; }
        public char Letter { get; set; }
        public string ImgSource { get; set; }
    }

public class TemplateJS
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<SymbolJS> Symbols { get; set; }
    }

public class SymbolJS
    {
        public int Id {get; set;}
        public char Letter { get; set; }
        public string ImgSrc { get; set; }
    }


...