2012-05-29 54 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