我有一個Web服務返回一些數據,然後將其轉換爲服務器上的新實體,然後傳遞給客戶端,用戶可以在其中編輯它們。如果他選擇SaveChanges
,則應將實體提交給服務器並插入到數據庫中。我有兩個問題:如何使用breezejs從服務器獲取新的(EntityState.New)實體
- 當實體返回到客戶端,微風將其標記爲
EntityState.New
- 微風預期,即不變實體具有主鍵設置。因爲沒有返回的新實體的具有按鍵(類型的鍵值的Int32等於0),微風認爲,服務器返回的同一實體
的多個實例,爲了說明問題,改變ToDosController.ToDos
AngularJS樣品中的方法來匹配以下:
[HttpGet]
public IEnumerable<TodoItem> Todos()
{
return new TodoItem[]
{
// Keys are not set because (equals to 0) these are new entities
new TodoItem() { Description="First item"},
new TodoItem() { Description="Second item"},
};
}
當你運行示例中,HTML頁面會顯示兩行,都將有說明「第二項」。如果我明確地設置了服務器上這些項目的Id(我不想這樣做,因爲這些密鑰是由數據庫生成的),但問題沒有表現出來。
問題:如何正確地從服務器返回實體,以便它們將被標記爲EntityState.New
,當調用SaveChanges
時,它們將被保存到數據庫(使用生成的密鑰)。
我期望客戶端上的一些MergeStrategy
或服務器上的一些額外的數據/屬性來實現這一點,但無法找到一個。
UPDATE:
澄清:
我盡力支持的方案時,用戶選擇和編輯從其他來源起源的實體之一,這應該是後來添加到我的數據庫。
在細節:
客戶端調用與搜索條件方法參數的服務器。服務器方法返回
IEnumerable<Customer>
- 它不返回IQueriable<Customer>
服務器查詢後端Web服務(CRM系統)和後端網絡服務的結果轉換成
Customer
實體。結果返回給客戶端。後端Web服務不可用於客戶端。客戶端顯示結果給用戶
用戶選擇的實體之一和編輯其屬性(如變更顧客的姓名或地址)
所選客戶被添加到實體管理器上客戶端。它應該是在
EntityState.Added
em.SaveChanges
被調用時,它提交Add
版實體服務器插入新客戶到數據庫服務器,數據庫生成新的主鍵,這是返回給客戶端,其中EM更新的實體按鍵,並設置實體狀態
EntityState.Unchanged
也許我需要分離的實體和正確的問題是:「如何實體返回給客戶端無需插件把他們交給實體經理?「(它們將在上面的步驟5中添加)。
P.S: 一個解決方案是使用自定義的非實體數據類型(如CustomerFromCRM)作爲我的服務器方法的結果。然後,我會將它們轉換爲客戶端上的實體Customer。但我想避免創建額外的類。
UPDATE2:我發現了一個類似的問題(有沒有公認的answere)位置:is there an easy way to mark an entity in the cache as "added"?
感謝您的回答。 1)你是對的,沒有'EntityState.New'。 2)我已經更新了這個問題來澄清情況。 3)我不能爲我的數據庫輸入初始數據,因爲數據來源於外部數據源(數據庫中尚未存在)。 4)我無法在客戶端創建新實體,因爲我沒有關於它們的數據。上面的代碼示例只是爲了說明 - 它包含常量而不是調用後端Web服務並將結果轉換爲實體。 – matra