2009-04-29 236 views
10

我創建了一個n層解決方案,我從WCF服務中檢索相關數據,在Windows窗體應用程序中更新它,然後通過WCF返回更新後的數據以保存到數據庫。應用程序,WCF服務和數據庫都在不同的機器上。實體框架,WCF&更新

被檢索的數據由一個對象和子對象的...

public Product Select(string catalogueNumber) { 

    return (from p in this.ProductEntities.Products.Include(@"Tracks") 
      where p.vcCatalogueNumber == catalogueNumber 
      select p).FirstOrDefault() ?? new Product(); 
} 

這些更新由客戶端應用程序可以,以及更新現有的內容,還插入其他「音軌」對象被施加。

當我收到的產品對象返回客戶端應用程序,我可以正確地看到所有更新,但爲了保存所有的變化正確地我有過幾個跳火圈......

public void Save(Product product) { 

    Product original = this.Select(product.vcCatalogueNumber); 
    if (original.EntityKey != null) { 

     this.ProductEntities.ApplyPropertyChanges(product.EntityKey.EntitySetName, product); 

     // There must be a better way to sort out the child objects... 
     foreach (Track track in product.Tracks.ToList()) { 

      if (track.EntityKey == null) { 
       original.Tracks.Add(track); 
      } 
      else { 
       this.ProductEntities.ApplyPropertyChanges(track.EntityKey.EntitySetName, track); 
      } 

     } 

    } 
    else { 

     this.ProductEntities.AddToProducts(product); 

    } 

    this.ProductEntities.SaveChanges(); 

} 

當然,必須有一個更簡單的方法來做到這一點?

注意:我在下午調查EntityBag項目的過程中花了很多時間,但發現這個項目還沒有更新以與EF RTM一起使用。特別是,雖然它會成功更新現有的數據異常,但在混合新對象時會拋出異常。

回答

3

對於您的特定場景,我沒有現成的答案 - 但只是一個問題:您是否檢出了ADO.NET Data Services(f.k.a.「Astoria」)?

它們基於Entity Framework,WCF的RESTful接口構建,它們提供了客戶端體驗,而且它們似乎也有一個體面的故事,不僅用於查詢,還用於更新,將記錄插入到數據庫中。

這可能是一個選項嗎?

檢查出來的MSDN,在David Hayden's blog,在Channel9,或看到一些優秀的會議在MIX08 and MIX 09

馬克

+0

這可能是東西,我應該看看,但至今我還沒有。不幸的是,我們最近纔開始在我工作的地方使用EF&WCF,而Astoria目前僅僅是要進行調查的新技術列表中的另一項目。謝謝。 – 2009-05-07 17:46:14

+0

我終於看到了這個(主要是因爲我開始玩SilverLight),實際上,我認爲這是我正在尋找的答案。 – 2009-08-20 11:50:25

0

實體框架v1.0的一個侷限性是更新實體。不幸的是,我認爲在版本2到來之前你運氣不佳。

3

你或許應該看看丹尼·西蒙斯EntityBag樣品。

它旨在簡化這些各種各樣的問題: http://code.msdn.microsoft.com/entitybag/

正如卡茨說事情會在.NET 4.0中輕鬆很多。

我們計劃幫助的事情之一是爲您創建一個T4模板,爲您生成能夠進行自我跟蹤的類,以及一些額外的表面以使這些自我跟蹤實體變得簡單當他們回到服務器層時,將ApplyChanges()應用到上下文。

希望這有助於

乾杯 克斯(對實體框架團隊在微軟PM)。

1

我看到這個線程很安靜,所以我允許自己做一些更新......

Weeeeee! 自助追蹤實體已經抵達EF 4!

檢查了這一點:

http://blogs.msdn.com/efdesign/archive/2009/03/24/self-tracking-entities-in-the-entity-framework.aspx
由實體框架團隊自追蹤機制的說明。

http://aleembawany.com/2009/05/17/new-features-in-entity-framework-40-v2/
在EF 的Anouncement新功能4.

http://msdn.microsoft.com/en-us/magazine/ee321569.aspx
比較的幾個N層圖案爲斷開的實體。

享受!

1

在實體Framewrok 4,你可以使用的方法「ApplyCurrentValues」更新分離實體。

在您的場景將是這樣的:

this.ProductEntities.Product.ApplyCurrentValues(product); 
foreach (Track track in product.Tracks.ToList()) { 
if (track.EntityKey != null) 
{ 
//Update Entity 
    this.ProductEntities.Track.ApplyCurrentValues(track); 
} 
else 
{ 
    //New Entity 
    this.ProductEntities.Track.Attach(track); 
} 

}

我希望這將是有益的