3

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

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

2 回答 2

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;
    }
}

在用户界面代码中:

string id = .....;
string columnA= txtA.Text;
strign columnB = txtB.Text;

var service = new ParentService();
ParentEntity parent = service.Update(id, columnA, columnB);
于 2013-06-03T10:45:27.000 回答
1

EF 仅从它了解对象的那一点开始跟踪更改。在 EF 中使用更新的最简单方法是从数据库加载现有对象,对其进行更新,然后将其保存回来。在这种情况下,这意味着您应该ParentEntity从数据库中加载对象。

另一种方法是照常使用Attach。在这种情况下,您应该首先调用 attach the changed ParentEntity然后调用ParentEntity.ChildEntity.Add(entityChild).

另一种选择是将新的ChildEntity直接显式添加到 DbContext,然后您可以简单地将外键值设置为ChildEntity键值ParentEntity以使它们连接。

于 2013-06-03T10:12:04.333 回答