实体框架嵌套实体添加或更新

时间:2014-05-08 06:46:51

标签: asp.net-mvc entity-framework

我有两张桌子。客户和对话。在创建/编辑客户端的视图中,还有一个用于添加与客户端关联的对话的选项(使用BeginCollectionItem)。当我尝试使用以下代码更新(在编辑视图中):

db.Clients.Attach(client);
db.Entry(client).State = EntityState.Modified; //Conversations not added

更新了Client表中的字段,但未添加对话。创建客户端时我没有遇到这个问题。

db.Clients.Add(client); //Conversations are added

是否可以在不必明确添加会话的情况下完成此操作?

1 个答案:

答案 0 :(得分:1)

首先附加客户端,然后将对话添加到其中:

var client = db.Clients.Attach(new Client());
client.Conversations.Add(conversation);

db.SaveChanges();

无需以编程方式更改客户端的状态。如果首先将客户端附加到上下文,实体框架将跟踪更改。

编辑:

由于在将对象附加到上下文时已经构造了对象,因此您需要告诉EF已经添加或修改了对话的子对象

foreach (var conversation in client.Conversations)
{
    if (conversation.Id == default(int))        
        context.Entry(conversation).State = EntityState.Added;
    else
        context.Entry(conversation).State = EntityState.Modified;
}