2012-05-29 51 views
1

我有以下的情况,我有一个WCF数据服务与User对象和message对象和message对象有两个关系user,发送器和接收器。WCF数据服务 - 添加的对象与对象相关

当我尝试添加一个新Message对象相关的用户留下空

Message message = new Message(); 
message.text = InputText; // string 
message.Sender = Sender; // User object 
message.Receiver = Receiver; // User object 

context.AddToMessages(message); 
context.BeginSaveChanges(new AsyncCallback((result) => 
{ 
    // Some code 
})); 

现在的发送者和接收者将是无效的。当我尝试在这样的BeginSaceChanges之前设置链接时,我收到错误“InvalidOperationException:上下文当前没有跟踪实体。”

context.AddToMessages(message); 
context.AddLink(message, "Sender", message.Sender); 
context.AddLink(message, "Receiver", message.Receiver); 
context.BeginSaveChanges(new AsyncCallback((result) => 
{ 
    // Some code 
})); 

如何确保关系正确创建?

回答

1

感谢Pratik,我找到了解决方案。我必须首先使用现有的用户SenderReceiver附加到上下文,因为它们没有被跟踪(并且如果他们在第二次调用时添加了它们)。然后,我添加的消息,并使用SetLink的链接设置为两个用户(而不是AddLink

if(context.GetEntityDescriptor(message.Sender) == null) 
    context.AttachTo("Users", message.Sender); 
if (context.GetEntityDescriptor(message.Receiver) == null) 
    context.AttachTo("Users", message.Receiver); 
context.AddToMessages(message); 
context.SetLink(message, "Sender", message.Sender); 
context.SetLink(message, "Receiver", message.Receiver); 
context.BeginSaveChanges(new AsyncCallback((result) => 
{ 
    // Some code 
})); 
0

我相信你需要使用DbSet.Attach方法。我假设你在后端使用实体框架。

+1

您需要发送者和接收者对象添加到上下文第一,呼吁AddLink API之前。此外,由于发件人和收件人是引用属性,因此您需要调用SetLink API而不是AddLink。 – Pratik