是否将父实体再次附加到上下文并更新它应该更新子实体?我错过了什么吗?
或者我是否必须为子实体编写更新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();
更新(父级加载代码示例)
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()
}
}
答案 0 :(得分:1)
EF仅跟踪对象的了解。在EF中使用更新的最简单方法是从数据库加载现有对象,更新它然后将其保存回来。在这种情况下,这意味着您应该从DB加载ParentEntity
对象。
另一种方法是像你一样使用Attach
。在这种情况下,您应该首先调用附加未更改的 ParentEntity
,然后调用ParentEntity.ChildEntity.Add(entityChild)
。
另一种方法是直接将新ChildEntity
直接添加到DbContext,然后您只需将ChildEntity
的外键值设置为ParentEntity
的键值即可他们相互联系。
答案 1 :(得分:1)
您应该在using语句中加载和更新您的实体 - 这样,实体框架将跟踪所有更改:
using (var context = new DBEntities())
{
// load and update entities
// ....
context.SaveChanges();
}
更新 - 这只是一个例子,我会保持简单。我会创建一个服务,我会把我的逻辑 - 就像这样:
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);