1


0

部分クラスを通じてエンティティをカスタマイズできることはわかっていますが、エンティティのプロパティを変更するための一般的な方法は何ですか? get / setのロジックを変更したい場合はどうすればいいですか? 属性を追加するのはどうですか? 自動生成されたコードを編集したくありません - どうやって人々はこれを回避しますか?

5 Answer


1


コードを自動生成しないでください。 デザイナを使わずに独自のlinq to sqlクラスを構築することができます。

編集:これを行う私の怠惰な方法は、コードを自動生成し、それを生成されていないファイルにコピーペーストし、そしてデザイナーファイルを削除することです。 でもあなた次第。


1


Linq2SQLクラスは_部分クラス_です。つまり、独自のファイルを追加してそこに部分クラスの別の部分を宣言することで、それらを簡単に拡張できます。

そのファイルでは、必要に応じてクラスをカスタマイズできます - そしてそれは別のファイルなので、コード生成はそれを上書きしません。

あなたが見れば AdventureWorksデータベースの "Contact"クラスのLinq2SQLは、これをAdventureWorks.designer.csファイルに生成します。

[Table(Name="Person.Contact")]
パブリック部分クラスContact:INotifyPropertyChanging、INotifyPropertyChanged {

これで、プロジェクトに "Contact.cs"ファイルを追加して、その部分クラスを拡張できます。 新しいプロパティ "DisplayName"を導入することによって:

パブリック部分クラス連絡先{パブリック文字列DisplayName {get {戻り値string.Format( "{0} {1}"、FirstName、LastName); }}}

コンパイル時に、クラスのこれら2つの部分はマージされます。

他の部分は部分的なメソッドです - あなたが実装するために利用可能なメソッドですが、それらが実装されていない場合、それらへの呼び出しはコンパイラによって最適化されています。

Linq2SQLの各オブジェクトクラスに対して、たくさんの部分メソッド(.NET 3.0の新機能)が作成されています - それらを実装するのはあなた次第です!

部分的なvoid InsertContact(連絡先インスタンス)。部分的なvoid UpdateContact(連絡先インスタンス)。部分的なvoid DeleteContact(連絡先インスタンス)。

部分的なvoid OnLoaded();部分的な無効OnValidate(System.Data.Linq.ChangeActionアクション);部分的なvoid OnCreated();

部分的に無効OnFirstNameChanging(string value);部分的に無効OnFirstNameChanged();

部分的な無効OnLastNameChanging(文字列値)。部分的な無効OnLastNameChanged();

たくさんの拡張ポイント!

マーク


0


Linq2Sqlエンティティは封印されていないため、Linq2Sqlクラスから派生させ、派生クラスで変更を加えることができます。

私のプロジェクトでは、Linq2Sqlクラスに変更を加えることはしません。 代わりに、私は自分のニーズに合わせて調整できるPOCOの独自のセットを構築します。 それから、私はPOQをリポジトリパターンを使って埋めるためにLinq2Sqlを使います。

Rob Conneryのブログで、ASP.NET MVC Storefrontという素晴らしいWebキャストシリーズが公開されています。 最初のウェブキャストの1つで、彼はPOCOと共同でLinq2Sqlをリポジトリとして使用することをカバーしています


0


これをチェックしてください。

それはsqlmetal(デザイナーがあなたのコードを生成するために使用するものです)よりも良い方法です

しかしCodesmithのライセンスが必要ですが、私見に値する価値があります。


0


仮想とマークされていないクラスのプロパティの取得または設定のロジックを変更することは、いくつかの重大なハックなしには不可能です(これらの制限を回避する方法の例については、モックフレームワークを調べてください)。 それは仮想的なものをマークすることの全体的なポイントであり、それは仮想的な呼び出しとパフォーマンスの犠牲を犠牲にしてそれを使い捨てにします。

ただし、* Metadatatype *タグを使用すると、変更できない属性を使用して既存のクラスに注釈を付けることができます。

[MetadataType (typeof (BookingMetadata))]
公開部分クラスBooking {//これはあなたのカスタム部分クラスです}

パブリッククラスBookingMetadata {[必須] [StringLength(15)]パブリックオブジェクトClientName {get;}セット; }

[Range(1、20)]パブリックオブジェクトNumberOfGuests {get;セット; }

[必須] [DataType(DataType.Date)]パブリックオブジェクトArrivalDate {get;}セット; }}