2011-11-23 55 views
0

我在演示文稿和我的域名實體之間使用鬆散耦合。當客戶端調用SubmitChanges時,它會在服務器上正確調用我的插入方法,傳遞「將要添加的」表示模型實例。如何將服務器生成的主鍵返回給RIA客戶端

服務器端代碼將執行插入操作,包括生成主鍵。但我如何將這個主鍵傳回客戶端呢?

更新: 回覆評論讓我詳細說明:是的,我正在使用RIA服務,但RIA服務服務與客戶交換的實體與訪問數據庫的實體並不相同。因此,我不能在服務器端放置一些幕後魔法。我的插入方法簽名看起來像這樣:

public void InsertPerson(PersonInfo source) 
{ 


} 

的PersonInfo類看起來像這樣:

public class PersonInfo 
{ 
    [Key] 
    public Guid Id { get; set; } 
    public String Name { get; set; } 
    // you get the point 
} 

在插入主密鑰被確定(服務器端)的處理的客戶端側顯然需要此信息,它是如何得到它的?

回答

2

@GarethOwen即使有POCO對象,只要將它們設置爲服務中的POCO對象,它們應該在客戶端上更新即可。通常情況下,如果您不使用Guid,則不設置POCO ID。所以如果你使用一個int作爲ID,那麼你可以這樣做。

public void InsertPOCO(POCOObj POCO) 
{ 
    RealObj x = new RealObj(); 

    x.Info = ...(information)...; 

    this.DataContext.RealObjs.InsertOnSubmit(RealObj); 

    this.DataContext.SubmitChanges(); 

    // Once the Submit Changes has run, the x object will then have an id value associated with it, and you can now assign the ID value of the POCO Object 
    POCO.Id = x.Id; 
} 

然後,您不必爲域值服務重新查詢域值。

+0

事實上,我們使用GUID作爲主鍵值。 –

+0

感謝您提供這些信息 - 我會在星期一嘗試一下 – GarethOwen

0

從你的標籤我假設你正在使用RIA服務。如果您已經映射了包括表的ID在內的實體,則只需將插入的標識返回到客戶端的相同對象中。

就像下面的示例代碼(其它問題複製在這裏SO):

MyEntity ent = new MyEntity(); //entity that has Id, mapped 
//from primary key (Identity) from data base 

MyDataContext.MyEntities.Add(ent); 
MyDataContext.SubmitChanges(op => { 
    if (!op.HasError) MessageBox.Show(ent.Id.ToString()); 
}); 
+0

我已經更新了我的問題,提供了更多關於發生了什麼的詳細信息,以及爲什麼您的答案在我的特定情況下很短。 –

+0

好的清楚,所以你做一個客戶端的RIA服務對象映射到自定義數據對象,然後你發送這些自定義數據對象回到ria服務插入?你是否使用實體框架來存儲這個自定義類PersonInfo?然後你可以返回插入方法中的身份作爲f.i.一個常規的int並在客戶端自己完成自定義類的映射? –

0

羅迪是正確的,只要你設置你的PersonalInfo對象的ID值在服務器端是對象將在完成提交更改後在客戶端進行更新。您是否嘗試訪問提交更改完成回調之外的Id值?我假設這是一個異步請求?

+0

由於InsertPersonInfo函數返回void,因此ID值如何返回給客戶端? –

+2

更新,插入和刪除方法確實返回空白,但實際對象是通過引用傳遞給域服務的,因爲這是c#首先處理變量的方式。因此,影響服務器端變量的任何更改都會通過域服務連接的引用傳回客戶端。所以,儘管insert,update和delete方法返回空值,但這些值仍然在客戶端更改和更新。 –

+0

@devnew,如果你將你的命令作爲答案,我一定會把它作爲一個好的。我已經驗證客戶端和服務器之間的RIA服務正在完成您描述的內容。在我的辯護中,我會說,通過引用傳遞並不直觀, - 但我喜歡它;) –

0

我們有一個類似的鬆耦合架構。我們的DomainService與專門爲服務器 - 客戶端通信設計的POCO協同工作 - 因此,我們的持久層對客戶端(Silverlight和HTML5)隱藏得很好。

據我所知,服務器端生成的ID不會被髮送回客戶端。我們再次進行查詢以再次獲取對象。

我很感激,知道這是不必要的。

查看其他答案 - 這是可能的 - 我學到了這個問題,並且可以改進我們的代碼,因爲它。

相關問題