我正在使用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; }
}
答案 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();
}