Когда я пытаюсь обновить мой 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; }
}