使用一个上下文的多个实例保存对实体对象的更改
本文关键字:保存 实体 对象 实例 一个 上下文 | 更新日期: 2023-09-27 18:33:40
我的问题如下。我有一个带有 DalClass 的 DataAccessLayer 项目。在这个 Dal 类中,我有许多使用实体框架进行操作的方法。例如,一些伪代码来展示我们如何做到这一点。
class DalClass
{
public void SetEntityObject(EntityObject entityObject)
{
using (var context = new Entities())
{
context.EntityObjectSet.Attach(entityObject);
context.ChangeTracker.DetectChanges();
foreach (var entity in context.ChangeTracker.Entries())
{
entity.State = entityObject.EntityState;
}
context.SaveChanges();
}
}
public EntityObject GetEntitObject(Guid id)
{
EntityObject result;
using (var context = new Entities())
{
result = context.EntityObjectSet.Where(x => x.Id == Id);
}
return result;
}
}
每次使用 EF 执行操作时,我们都会创建一个新的实例上下文并执行一些工作。我的问题是我的 DalClass 中有一个方法来获取实体对象列表,如下所示:
public List<EntityObject> GetEntityObjectsByIds(List<Guid> idList)
{
using (var context = new Entities())
{
var query = from entityObject in context.EntityObjectSet
where idList.Contains(entityObject.Id)
select entityObject;
return query.ToList();
}
}
将列表返回到我的业务层类之后。我对每个实体对象、计算、更改一些属性值等进行了一些更改。之后,我从我的业务层类调用一个方法来使用此方法保存新编辑的列表:
public void UpdateEntityObjects(List<EntityObject> newEntityObjectList)
{
using (var context = new Entities())
{
var idList = entityObjectList.Select(x => x.Id).ToList();
var query = from entityObject in context.EntityObjectSet
where idList.Contains(entityObject.Id)
select entityObject;
var entityObjectList = query.ToList();
entityObjectList = newEntityObjectList;
context.ChangeTracker.DetectChanges();
foreach (var entity in context.ChangeTracker.Entries())
{
entity.State = EntityState.Modified;
}
context.SaveChanges();
}
}
问题我无法保存我在业务层中编辑的 newEntityObjectList。显然这是行不通的。
entityObjectList = newEntityObjectList;
那么保存newEntityObjectList的最佳方法是什么?
问题我必须两次触发此查询
var query = from entityObject in context.EntityObjectSet where idList.Contains(entityObject.Id) select entityObject;
解决方案 2.问题可能是如果我为GetEntityObjectsByIds((和UpdateEntityObjects((使用一个上下文实例。但是在我们所有的达尔课程中,我们都避免了这一点。即使我使用上下文类的一个实例,这也不能解决问题 1。那么如何保存 newEntityObjectList 呢?
好吧,我的 DAL 类肯定是这样的:
class EntityObjectDAL
{
private ObjectContext/DbContext context = new ObjectContext/DbContext();
public List<EntityObject> GetObjects() { return context.EntityObjects.ToList(); }
// Tracked by context. Just change it in BL
public void SaveObjects() { context.SaveChanges(); }
// Just call SaveChanges(), no need for anything special...
public void InsertObject(EntityObject eo) { context.EntityObjects.Add(eo); }
public void UpdateObject(EntityObject eo) { context.Entry(eo).State = EntityState.Modified; }
}
保持简单...