更新父实体不更新子实体
本文关键字:更新 实体 | 更新日期: 2023-09-27 18:16:27
是否再次将父实体附加到上下文并更新它应该更新子实体?我错过什么了吗?
或者我是否必须为子实体编写更新的EF逻辑(在DAL中)?
这是我的示例代码模型:ChildEntity entityChild;
if (ParentEntity.ChildEntity.SingleOrDefault() != null)
entityChild = ParentEntity.ChildEntity.SingleOrDefault();
else
{
entityChild = new ChildEntity();
ParentEntity.ChildEntity.Add(entityChild);
}
entityChild.ColumnA= txtA.Text;
entityChild.ColumnB= txtB.Text;
// Send entityParent for update
_objParent.Update(entityParent)
_objParent.Update()代码:
context.vouchers.Attach(entityParent);
ObjectStateEntry objectState = context.ObjectStateManager.GetObjectStateEntry(entityParent);
objectState.ChangeState(System.Data.EntityState.Modified);
context.SaveChanges();
UPDATE(父加载代码样本)
public ParentEntity GetById(int id)
{
using (var context = new DBEntities())
{
ParentEntity _entity = context.ParentEntity
.Include("ChildEntity")
.Where(e => e.parent_id == id);
return (ParentEntity)_entity.SingleOrDefault()
}
}
EF只跟踪从它了解对象的点开始的变化。在EF中使用更新的最简单方法是从DB加载现有对象,更新它,然后将其保存回来。在本例中,这意味着您应该从DB加载ParentEntity
对象。
另一种方法是使用Attach
。在这种情况下,您应该首先调用附加不变 ParentEntity
,然后调用ParentEntity.ChildEntity.Add(entityChild)
。
另一种选择是显式地将新的ChildEntity
直接添加到DbContext中,然后您可以简单地将ChildEntity
的外键值设置为ParentEntity
的键值,以使它们连接。
你应该在using语句中加载和更新你的实体——这样所有的变化都将被实体框架跟踪:
using (var context = new DBEntities())
{
// load and update entities
// ....
context.SaveChanges();
}
UPDATE—这只是一个示例,我将保持简单。我将创建一个服务,在其中放置我的逻辑——像这样:
public class ParentService
{
// other service methods here
protected DBEntities CreateContext()
{
return new DBEntities();
}
public ParentEntity Update(int id, string columnA, string columnB)
{
ParentEntity _entity = null;
using (var context = CreateContext())
{
bool isNew = false;
_entity = context.ParentEntity
.Include("ChildEntity")
.SingleOrDefault(e => e.parent_id == id);
ChildEntity entityChild = ParentEntity.ChildEntity.SingleOrDefault();
if(entityChild == null)
{
entityChild = new ChildEntity();
isNew = true;
}
entityChild.ColumnA = columnA;
entityChild.ColumnB = columnB;
if(isNew)
{
ParentEntity.ChildEntity.Add(entityChild);
}
context.SaveChanges();
}
return _entity;
}
}
在UI代码中:
string id = .....;
string columnA= txtA.Text;
strign columnB = txtB.Text;
var service = new ParentService();
ParentEntity parent = service.Update(id, columnA, columnB);