Добавление сложных объектов в Entity Framework - PullRequest
0 голосов
/ 10 ноября 2019

Я устанавливаю .NET Core API. Мое приложение разделено на 3 слоя:

  • Доступ к данным
  • Бизнес-логика / Услуги
  • API

У меня проблемыдобавлены связанные объекты с помощью метода API. Допустим, у меня есть следующие классы.

public class Part
{
    [Key]public int Id {get; set;}
    public string Name {get; set;}
    public string ICollection<PartAttribute> PartAttributes{get; set;}
}

public class PartAttribute
{
    [Key]public int Id {get; set;}
    public string Name {get; set;}
    public string Value {get; set;}
}

И следующие методы для взаимодействия с БД - контекст - это EF DbContext:

public virtual void Add(T entity)
{
    Context.Set<T>()
        .Add(entity);
}

У меня проблемы с добавлением Part, в которой уже есть атрибуты PartAttributes, если я отправляю следующий JSON через API (при условии, что следующая запись в PartAttributes уже существует)

{
        "Name":"Example1",   
        "PartAttributes":[
        {
            "attributeId":1,
            "name":"Color",
            "value":"black"
        }]
}

Я получаю следующее исключение: «Не удается вставить явное значение для столбца идентификации в таблице« PartAttributes », когда IDENTITY_INSERTустановлено на OFF. "- Это приводит меня к выводу, что EF не распознает существующую запись и пытается вставить ее как новую. Это приводит к сбою из-за установки вставки идентификатора в самом SQL Server.

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

1 Ответ

0 голосов
/ 10 ноября 2019

Вам нужно взять ваш первичный ключ (который здесь выглядит как attributeId) и загрузить запись, используя dbContext. После загрузки обновите значения и вызовите SaveChanges() или SaveChangesAsync() в контексте.

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

, например (SUDO CODE!):

public void InsertOrUpdate(PartAttribute model)
{
  var existingRecord = dbContext.Set<PartAttribute>().Find(model.attributeId);
  if(existingRecord == null)
  { // Insert (Should not include value for attributeId)
     dbContext.Add(model);
  }
  else
  { // Update
    existingRecord = model;
    dbContext.SaveChanges();
  }
}

Пожалуйста, дайте мне знать, если у вас все еще есть проблемы

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