Entity Framework Универсальный метод вставки снова вставляет уже существующую сущность вместе с новой сущностью - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть следующий метод вставки:

  public static bool Insert<T>(T item) where T : class 
    {
        using (ApplicationDbContext ctx = new ApplicationDbContext())
        {
            try
            {
                ctx.Set<T>().Add(item);
                ctx.SaveChanges();
                return true;
            }
            catch (Exception ex)
            {
               // ...
            }
        }
    }

Это работает, как и ожидалось, но когда я хочу вставить новую сущность, которая имеет отношение к существующей сущности, EF повторно вставляет эту реляционную (уже существующую) сущность снова вместе с новой сущностью.

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

Я что-то здесь не так делаю или это сделано специально, и не должен ли я использовать универсальную функцию вставки, когда реляционные сущности присоединены к моим новым сущностям?

Спасибо за любые предложения или информацию! С уважением

EDIT:

Product Entity:

// ... non relational properties

public ICollection<Price> Prices { get; set; }
public ICollection<Supplier> Suppliers { get; set; }
public ICollection<Productnumber> ProductNumbers { get; set; }

Цена объекта:

public Product Product { get; set; }
public Supplier Supplier { get; set; }

Поставщик:

public ICollection<Productnumber> ProductNumbers { get; set; }
public ICollection<Product> Products { get; set; }
public ICollection<Price> Prices { get; set; }

ProductNumber Entity:

 public Supplier Supplier { get; set; }
 public Product Product { get; set; }

Как мне перейти к вставке нового продукта? Возможно ли это с такой структурой и использованием универсальной вставки?

1 Ответ

0 голосов
/ 14 ноября 2018

Если вы хотите добавить новый продукт к существующему поставщику , вам нужно сделать следующее:

1- Извлечение субъекта поставщика, назовем его sup

2- Добавить новый Продукт к нему,

sup.Product = new Product{properties
    ...}

3 - Обновление поставщика ,

ctx.Entry(sup).State = EntityState.Modified;
ctx.SaveChanges();

Вы добавляли новую сущность поставщика каждый раз, когда использовали bool Insert<T> method, и поэтому вы получили неожиданное поведение, поэтому просто обновите вместо существующей записи.

Надеюсь, это поможет,

...