使用实体框架存储库模式添加新对象

时间:2015-08-12 19:03:37

标签: entity-framework repository-pattern

我正在使用Entity Framework并实现Repository模式。我添加新对象的每个例子都是这样的:

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 - 我不确定你的意思是什么&#34;将实体附加到上下文&#34;。这就是我目前在Repository类中所做的事情:

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

然后在我的Context类中:

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

2 个答案:

答案 0 :(得分:0)

您可以使用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);
}

答案 1 :(得分:0)

您可以在DbSet上使用AddOrUpdate扩展名(链接用于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();
   }