2011-05-17 2 views
1

自動的に生成されたLINQ to SQLデータクラスをサブクラス化し、そのオブジェクトの変更を保存したいと考えています。私は、データベース内のテーブルClientを持っている場合LINQをSQLデータエンティティにサブクラス化する - 間違ったアイデアか何かがない?

たとえば、私はクラスClientを拡張し、GenerateInvoice()または何のような振る舞いを追加ClientBOを作成することができます。サブクラスの値を更新したり、新しいレコードを挿入したりするまで、すべてうまく動作します。そのような変更は(予想通りに)破棄されます。私が紛失しているものがあるのですか?または、これらのサブクラスを最初に作成してLINQ to SQLまたはOOの原則に違反していますか?続き

は、私のコードの単純化された例です:

public class ClientBO : Client 
{ 
    public ClientBO(Client source) : base() 
    { 
     FirstName = source.FirstName; 
     Lastname = source.LastName; 
     // ... etc ... 
    } 
} 

List<ClientBO> clientList = 
    (from client in DatabaseContext.Clients select new ClientBO(client)).ToList(); 

clientList[ someIndex ].SomeField = NewValue; 
MyDatabaseContext.SubmitChanges(); 

答えて

4

問題は、あなたが変更されているオブジェクトは、データストアから得て、もはや同じオブジェクトであるということではありません。

DataContextは、添付したすべてのオブジェクトの変更を追跡します。しかし、あなたがそれを参照する際に "ソース"オブジェクトを変更することは決してないので、データコンテキストには決して変更が通知されません。

ClientBOの部分クラスを代わりにClientにすることをお勧めしますそれをクライアントに)。すべてのLINQからSQLへのクラスは、部分に生成されるので、あなたは簡単にこの方法このよう

それらを拡張することができます:私はあなたが本当にここで何をしたいと思います

public partial class Client 
{ 
    public void GenerateInvoice() 
    { 
     // ... etc ... 
    } 
} 

List<Client> clientList = MyDatabaseContext.Clients.ToList(); 

clientList[ someIndex ].SomeField = NewValue; 
MyDatabaseContext.SubmitChanges(); 
+0

+1あなたとホーガンの両方が、私が最初に検討すべき優れたアプローチです。私は既存のインフラストラクチャの変更を最小限に抑えるため、あなたと一緒に行くつもりです。 –

+0

+1これが行く方法だと思います。クライアントクラスに「GenerateInvoice」を追加することを再考したいかもしれません:)しかし、それはここでのポイントではありません。 – Pleun

+0

@Pleun - GenerateInvoice()は、抽象的な例であり、それには恐ろしい例があります。 –

1

は、いくつかの拡張メソッドです:

http://msdn.microsoft.com/en-us/library/bb383977.aspx

これらはクラスの一部であるように見えますが、別のモジュールに実装されます。まさにあなたが望むもの。

+0

+1あなたとオスカーの両方が適切です。 Oskarは既存のインフラストラクチャの変更を少なくします。しかし、私は最初にこれを検討していたはずです。 –