2016-10-12 3 views
0

У меня есть 3 стола Goods, Producer, Categories. Producer и Categories имеют отношение «один ко многим» с Goods, и у меня есть общий метод вставки, приведенный ниже.Как управлять вставкой EF в базу данных?

Проблема в том, что когда я пытаюсь вставить список товаров, сначала добавляется правильно, но если у следующего есть категория с одинаковым идентификатором, это исключает первичный ключ.

Но я хочу, чтобы вставить что-то вроде, проверяя каждый раз перед вставкой таблиц Categories и Producer, а если строка уже существует, просто обновите ее, например, или пропустите.

код с моделями и мой общий вкладыш здесь:

public class Good 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public decimal Price { get; set; } 

    public virtual Category Category { get; set; } 
    public virtual Producer Producer { get; set; } 

    public override string ToString() 
    { 
     return Id + "/" + Name + "/" + Price + "/" + Category.Name + "/" + Producer.Name + "/" + Producer.Country; 
    } 
} 

public class Producer 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Country { get; set; } 

    public virtual ICollection<Good> Goods { get; set; } 

    public override string ToString() 
    { 
     return Id + "/" + Name + "/" + Country; 
    } 
} 

public class Category 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Good> Goods { get; set; } 

    public override string ToString() 
    { 
     return Id + "/" + Name; 
    } 
} 

public void AddList(List<T> collection, DbContext GoodsContext) 
{ 
     foreach (var item in collection) 
     { 
      GoodsContext.Set<T>().Add(item); 
      GoodsContext.SaveChanges(); 
     } 
} 

ответ

1

Вы можете легко достигнуть этого с недавно выпустила EntityGraphOperations для Entity Framework Code First. И я опубликовал его в github, code-project и nuget. С помощью метода InsertOrUpdateGraph он автоматически установит ваши объекты как Added или Modified.

foreach (var item in collection) 
{ 
     // This will set the state of the main entity and all of it's navigational 
     // properties as `Added` or `Modified`. 
     GoodsContext.InsertOrUpdateGraph(item); 
     GoodsContext.SaveChanges(); 

     GoodsContext.Entry(item).State = EntityState.Detached; 
} 

Вы можете прочитать my article on Code-project с демонстрацией шаг за шагом, и проект, образец готов к загрузке.

+0

Можете ли вы объяснить, как выглядеть как InsertOrUpdateGraph для моего решения? Я создал сопоставления и добавил операции с графиком, но все же не могу повлиять на то, как insertorupdate будет выглядеть. – vtarbinskyi

+0

@Demsaas Вы должны добавить 'using EntityGraphOperations;' Вы можете загрузить и проверить образец проекта из codeproejct. –

+0

Хорошо, добавив сначала один путь, как вы сказали, а во втором - исключение: последовательность не содержит соответствующий элемент; – vtarbinskyi

Смежные вопросы