2010-01-30 75 views
1

我正在使用EF4自追蹤實體(VS2010 Beta 2 CTP 2加新T4發生器)。但是,當我嘗試更新實體信息時,它不會按預期更新到數據庫。EF 4自追蹤實體無法按預期工作

我設置了2個服務呼叫。一個用於GetResource(int id),它返回一個資源對象。第二個調用是SaveResource(Resource res);這裏是代碼。

public Resource GetResource(int id) 
    { 
     using (var dc = new MyEntities()) 
     { 
      return dc.Resources.Where(d => d.ResourceId == id).SingleOrDefault(); 
     }   
    } 

    public void SaveResource(Resource res) 
    { 
     using (var dc = new MyEntities()) 
     { 
      dc.Resources.ApplyChanges(res); 
      dc.SaveChanges(); 
      // Nothing save to database. 
     }  
    } 

    //Windows Console Client Calls 
    var res = service.GetResource(1); 
    res.Description = "New Change"; // Not updating... 
    service.SaveResource(res); 

    // does not change anything. 

在我看來,ChangeTracker.State總是顯示爲「未更改」。

這段代碼有什麼問題嗎?

回答

3

這可能是一個長鏡頭......但是:

我假設你的服務實際上是在另一層?如果您在同一層進行測試,您將遇到問題。

自跟蹤實體(STE)不記錄更改,直到它們連接到ObjectContext時,這個想法是,如果它們連接到ObjectContext,它可以記錄它們的更改,並且執行相同的工作沒有意義兩次。

STEs在客戶端使用WCF反序列化後開始跟蹤,即一旦它們物化爲沒有ObjectContext的層。

如果您查看生成的代碼,您應該能夠看到如何手動打開跟蹤。

希望這有助於

亞歷

+0

服務是在同一層,但不同層。我的想法是將所有內容寫入同一層(不同層),但如果需要,可以稍後更改爲不同的層。在上面的例子中,ObjectContext超出了每個服務調用的範圍,所以STE沒有跟蹤。或STE只適用於WCF場景?在性能和擴展性方面,在上述場景中EF 4的最佳方法(POCO,STE或其他)是什麼? – ashraf 2010-01-30 18:23:10

+1

跟蹤通過反序列化打開,因此儘管ObjectContext超出了範圍,但它仍處於同一層,並未打開。 – 2010-01-30 22:34:54

0

從丹尼爾·西蒙斯閱讀下面的提示後,STE開始跟蹤。這是整篇文章的鏈接。 http://msdn.microsoft.com/en-us/magazine/ee335715.aspx

確保在您的客戶端重用自我跟蹤實體模板的生成實體代碼。如果您使用Visual Studio或其他工具中的「添加服務引用」生成的代理代碼,大部分內容看起來都是正確的,但是您會發現實體並未實際跟蹤其在客戶端上的更改。

所以在客戶端請確保您不使用添加服務引用來獲取代理,而是通過以下代碼訪問服務。

var svc = new ChannelFactory<IMyService>("BasicHttpBinding_IMyService").CreateChannel(); 
var res = svc.GetResource(1); 
0

如果您使用的是沒有WCF的STE,則可能需要手動調用StartTracking()。

1

您必須與客戶與服務之間的STE共享程序集 - 這是主要觀點。然後,在添加服務引用時,確保選中「重用引用程序集中的類型」。

原因是STE包含無法通過「添加服務引用」傳輸的邏輯,因此您必須共享這些類型以在客戶端上具有跟蹤邏輯。

0

我有同樣的確切問題,並找到解決方案。

看來自動跟蹤實體自動開始跟蹤,您需要在添加服務引用之前引用您的STE項目。

這種方式Visual Studio生成一些.datasource文件,這是做最後的伎倆。

我發現這裏的解決方案: http://blogs.u2u.be/diederik/post/2010/05/18/Self-Tracking-Entities-with-Validation-and-Tracking-State-Change-Notification.aspx

至於手動啓動跟蹤,似乎不必對客戶端這些方法。

希望它有幫助...