更新父实体不更新子实体

本文关键字:更新 实体 | 更新日期: 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);