2008-09-17 78 views
7

我得到了創建一個業務對象或實體來表示某個人的概念。然後我可以使用DTO序列化Person並將其發送給客戶端。如果客戶端改變了對象,它可以在那裏有一個IsDirty標誌,所以當它被髮回到我知道要更新的服務器時。如何跟蹤對業務對象的更改?

但是如果我有一個Order對象呢?這具有主標題信息,客戶,供應商,要求日期等。然後它具有OrderItems,它是列表< OrderItem>,是要訂購的項目。我希望能夠在我的用戶界面上使用此業務對象。所以我有一些文本框連接到位置,供應商,要求的日期等,並連接到OrderItems的網格。由於OrderItems是一個List,我可以很容易地向它添加和刪除記錄。但我如何跟蹤這個,尤其是已刪除的項目。我不希望刪除的項目在我的網格中可見,如果我使用foreach,我不應該能夠遍歷它們,因爲它們已被刪除。但我仍然需要追蹤有刪除的事實。如何跟蹤更改。我想我需要使用一個工作單元?但是,代碼似乎變得相當複雜。那麼我想知道爲什麼不簡單地使用DataTable並獲得免費的更改跟蹤?但後來我讀到了業務對象是如何走的。

我在簡單的Person例子中發現了各種不同的例子,而不是像Orders這樣的header-detail例子。

順便說一句,使用C#3.5爲此。

回答

-1

數據對象不會跟蹤更改。更改跟蹤發生在您通過DataContext檢索的DataContext和對象上。因此,爲了跟蹤變化,你需要做到以下幾點:

public class FooDataContext : DataContext 
{ 
    public Table<Order> Orders; 
} 

public class Order 
{ 
     [DbColumn(Identity = true)] 
     [Column(DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)] 
     public int Id { get; set; } 

     [DbColumn(Default = "(getutcdate())")] 
     [Column(DbType = "DateTime", CanBeNull = false, IsDbGenerated = true)] 
     public DateTime DateCreated { get; set; } 

     [Column(DbType = "varchar(50)", CanBeNull = false, IsDbGenerated = false)] 
     public string Name { get; set; } 
} 

現在在你的代碼隱藏,你可以這樣做:

public void UpdateOrder(int id, string name) 
{ 
    FooDataContext db = new FooDataContext(); 
    Order order = db.Orders.Where(o=>o.Id == id).FirstOrDefault(); 

    if (order == null) return; 

    order.Name = name; 

    db.SubmitChanges(); 
} 

我不會直接建議使用數據上下文中的代碼後面,但這是開始使用Linq To SQL的好方法。我建議將所有數據庫交互放在一個外部項目中,並從GUI調用封裝此行爲的類。

如果您是Linq To Sql的新手,我會建議創建一個Linq To Sql(dbml)文件。

右鍵單擊解決方案資源管理器中的項目,然後選擇添加新項目。選擇Linq To SQL文件,然後它會讓你連接到你的數據庫並選擇表格。

然後,您可以查看生成的代碼,並獲得一些有關Linq To Sql如何工作的好主意以及您可以如何使用它。

使用,作爲對使用LINQ工作,SQL,這將帶你的指導...

+0

出路! – 2009-10-29 13:04:26

6

首先,你可以使用現有的框架,解決了這些問題,像CSLA.NET。這個框架的作者已經解決了這些問題。爲此,請致電http://www.rockfordlhotka.net/cslanet/。即使你不使用完整的框架,這些概念仍然適用。

如果你想推出自己的產品,我過去所做的就是不使用List來代替我的集合,而是使用了從BindingList派生的自定義類型。從BindingList中插入允許您覆蓋添加/刪除項目的行爲。因此,您可以在另一個內部收集「已刪除」項目。每次在您的集合上調用覆蓋方法Remove方法時,將該項目放入「已刪除」集合中,然後調用Remove方法的基本實現。您可以對添加的項目或更改的項目執行相同的操作。

2

你很關心需要一個單位的工作,但不寫一個。使用NHibernate或其他一些ORM。這是他們的目標。他們有內置的工作單元。

業務對象確實是大多數應用程序的「路要走」。你正在深入潛水,這將有很多學習要做。看看DDD。

我也強烈建議您在代碼隱藏方面不要這樣的代碼。研究MVP模式。

我也會(當我很費勁地學習大量新的,高度關鍵的東西)看看SOLID。

你可能想看看JP Boodhoo的東西,但.net課程,因爲它涵蓋了很多這些東西。