使用 Entity Framework 存储库模式添加新对象

Adding New Objects with Entity Framework Repository Pattern

我正在使用 Entity Framework 并实施存储库模式。我添加新对象的每个示例都是这样的:

class MyRepository
{
   public MyContext Context { get; set; }

   public Add(MyObject myObject)
   {
      this.Context.MyObjects.Add(myObject);
   }

   public Save()
   {
      this.Context.SaveChanges();
   }  
}

// A window which lets the user add items to the repository
class MyWindow
{
   private MyRepository Repository { get; set; }

   private void DoSomething()
   {
      List<MyClass> myObjects = this.Repository.GetMyObjects();

      // When I create a new object, I have to add the new object to the myObjects list and separately to the repository
      MyClass newObject = new MyClass();
      myObjects.Add(newObject);
      this.Repository.Add(newObject);

      // Do stuff to the objects in "myObjects"

      this.Repository.Save();
   }
}

我想要做的是将新对象添加到 myObjects 列表中(不必在单独的行中将它们添加到存储库中),然后只需调用 this.Repository.Save(myObjects)当我准备好拯救他们时。必须将每个新对象显式添加到存储库似乎会破坏关注点分离模型。是否有推荐的方法来执行此操作,或者我的推理有缺陷?

编辑:DDiVita - 我不确定您所说的 "attaching the entities to the context" 是什么意思。这就是我目前在我的存储库中所做的 class:

public List<MyObject> GetMyObjects()
{
   return this.Context.MyObjects.ToList();
}

然后在我的上下文中 class:

class MyContext : Context
{
   public DbSet<MyObject> MyObjects { get; set; }
}

你可以做的是使用 AddRange

public Save(List<MyObject> myObjects)
{
   this.Context.MyObjects.AddRange(myObjects);
   this.Context.SaveChanges();
}

然后您的代码可能如下所示

private void DoSomething()
{
   List<MyObject> myObjects = this.Repository.GetMyObjects();

   MyObject newObject = new MyObject();
   myObjects.Add(newObject);

   // Do stuff to the objects in "myObjects"

   this.Repository.Save(myObjects);
}

您可以在 DbSet 上使用 AddOrUpdate 扩展(link 用于 EF 版本 6)方法。有了它,您可以指定一个标识符,EF 会将其识别为唯一值以更新或添加实体。

让我们假设您的实体 MyObject 看起来像这样并且 Id 在您的数据库中始终是唯一的:

public class MyObject
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

public Save(List<MyObject> myObjects)
   {
        this.Context.MyObjects.AddOrUpdate(m => m.Id,myObjects.ToArray());
        this.Context.SaveChanges();
   }