C # лучший способ удалить множество коллекций в EntityFramework

#entity-framework #c#-4.0

#entity-framework #c #-4.0

Вопрос:

У меня есть следующие классы с отношением один ко многим

 public class Category
{
    public Category()
    {
        this.Products = new List<Product>();
    }
    public int Id {get;set;}
    public string Name {get;set;}
    public ICollection<Product> Products {get;set;}
}

public class Product
{
    public int Id {get;set;}
    public string Name {get;set;}
    public int CategoryId {get;set;}
    public Category Category {get;set;}
}

My datacontext is as shown below:

public class MyContext : DbContext
{
    public virtual IDbSet<Category> Categories { get; set; }
    public virtual IDbSet<Product> Products { get; set; }
}
  

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

В принципе, из предоставленной коллекции, если указан productid, выполните обновление, если объект недоступен, затем добавьте новый продукт. если их нет в списке, удалите из базы данных.

Вот что я пытаюсь.

 using (var dbCtx = new MyDBEntities())
{
    //1- Get data from database
    //2- Find newly added items
    //3- Find deleted items
    //4- Find modified
    //5- Mark all added items entity state to Added
    //6- Mark all deleted item entity state to Deleted
    //7- Apply modified items current property values to existing property values
    dbCtx.SaveChanges();
}
  

Комментарии:

1. вы что-нибудь пробовали? есть код для этого?

2. Я обновил то, что я пытаюсь сделать. Я не прошу никаких примеров кода. но хотите знать лучший способ добиться этого. Спасибо

Ответ №1:

Давайте обратим внимание на эти строки:

  1. Получение данных из базы данных
  2. Поиск новых добавленных элементов
  3. Поиск удаленных элементов
  4. Найти измененный
  5. Пометьте все добавленные элементы entity state как добавленные
  6. Отметьте все удаленные элементы состояния объекта как удаленные
  7. Примените текущие значения свойств измененных элементов к существующим значениям свойств

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

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

 // This will set the state of the main entity and all of it's navigational 
// properties as `Added` or `Modified`.
context.InsertOrUpdateGraph(category)
       .After(entity =>
       {
            // And this will delete missing products.
            entity.HasCollection(p => p.Products)
               .DeleteMissingEntities();
       });  
  

Обновить:
После некоторых комментариев я решил создать примерный проект и объяснить, как написать примерный проект. Я обновил свою статью в Code-project пошаговой демонстрацией, и пример проекта готов к загрузке.

Комментарии:

1. Это работает для вас @Mukil Deepthi? мы хотели бы узнать об этом интересном API. надеюсь, вы дадите отзыв.

2. @Sampath Я не мог найти время, чтобы добавить пример проекта в Visual Studio. Но завтра я добавлю пример проекта и обновлю свой ответ. Надеюсь, вы увидите результат. Спасибо за интерес.

3. да, это здорово. пожалуйста, дайте нам знать, как только вы это сделаете 🙂

4. @Sampath Я обновил свою статью о проекте с проектом и пошаговой демонстрацией. Проверьте мой обновленный ответ на ссылку.

5. Конечно. Я пройдусь по статье COP и там тоже дам отзыв. 1 за ваш трудолюбие. Спасибо 🙂 .Но я действительно разочарован отзывами OP (@Mukil Deepthi). Он постоянно игнорирует его отзывы. Что очень ПЛОХО.