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