更新父实体不会更新子实体

时间:2013-06-03 08:24:33

标签: c# entity-framework entity-framework-4

是否将父实体再次附加到上下文并更新它应该更新子实体?我错过了什么吗?

或者我是否必须为子实体编写更新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()
        }
    }

2 个答案:

答案 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);