EF проблема добавления сущности со списком дочерних сущностей - PullRequest
0 голосов
/ 26 августа 2018

Я пытался обновить сущность, которая будет иметь список дочерних сущностей, но по какой-то причине я продолжаю получать ту же ошибку, и я не знаю, что я делаю неправильно.Любая помощь будет оценена.Ошибка:

Операция не выполнена: связь не может быть изменена, так как одно или несколько свойств внешнего ключа не могут иметь значение NULL.Когда в отношение вносится изменение, для соответствующего свойства внешнего ключа устанавливается нулевое значение.Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, свойству внешнего ключа должно быть назначено другое ненулевое значение или несвязанный объект должен быть удален.

Сильфонэто то, что я пытаюсь:

public class Parent
{
    [Key]
    public int Id { get; set; }

    [MaxLength(25)]
    public string Name { get; set; }

    [MaxLength(25)]
    public string FullName { get; set; }

    public virtual ICollection<Child> ChildList { get; set; } = new HashSet<Child>();
}

public class Child
{
    [Key]
    public int Id { get; set; }

    [Required]
    [MaxLength(12)]
    public string Number { get; set; }

    [IgnoreMap]
    public Parent Parent { get; set; }

    public int ParentId { get; set; }
}

public async Task<Parent> UpdateParent(Parent Parent)
{
    Parent originalParent = await GetById(Parent.Id, c => c.ChildList);

    Mapper.Map(Parent, originalParent);
    await DbContext.SaveChangesAsync();

    return originalParent;
}

Также я заметил, что если я не использую automapper и просто сопоставляю свойства вручную, это работает:

private static void MapParentProperties(Parent parent, Parent originalParent)
{
    originalParent.Name = parent.Name;
    originalParent.FullName = parent.FullName;
}

1 Ответ

0 голосов
/ 28 августа 2018

Я некоторое время не использовал Automapper с EF из-за прошлых проблем, похожих на этот, и из-за ленивого триггера загрузки, но в последнее время я копался в нем, учитывая, что, похоже, его поддержка IQueryable лучше.Я не уверен, что это все еще так, но у Automapper было ограничение на то, что сопоставленные дочерние коллекции будут заменены по умолчанию, а с EF это можно рассматривать как новые сущности, помеченные для вставки, или существующие дочерние сущности, «вытесненные» изродитель и EF отмечают, что их FK не может быть обнулен.Решение состояло в том, чтобы сказать Automapper сохранить целевую коллекцию, а затем обрабатывать эти сопоставления индивидуально.(с использованием дочерних карт) Может потребоваться дополнительная работа для обработки вставок и удалений в измененной коллекции.

Что-то, что может помочь: http://bzbetty.blogspot.com/2012/06/updating-collections-using-automapper.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...