2009-08-27 14 views
3

私は監査プロパティ用の抽象基本クラスを持っています。簡潔にするために、それはLinqからSQLへのテーブルへの派生クラスのマッピング

Public MustInherit Class AbstractAuditableEntity 
    ... 
    Public Property CreatedTime() As DateTimeOffset 
    ... 
End Class 

を一つの特性を持っている。そして、私の監査可能なドメインオブジェクトがこのクラス

Public Class Source 
    Inherits AbstractAuditableEntity 
    ...   
    Public Property SourceId() As String 
    ... 
End Class 

から継承すると言う私は、私は私のドメインオブジェクト「ソース」をマップするには、次の表のDDLを持っています。基本的には、各(具体的な)ドメインオブジェクトとテーブルの間の関係は1-1であり、各テーブルには必要な監査列があります。

外部のマッピングは、クラスを表にマップする私の最初の試みは愚かだろうファイルを使用して
CREATE TABLE Source 
( 
    SourceID VARCHAR(10) NOT NULL, 
    CreatedTime DATETIMEOFFSET(3) NOT NULL, 
    CONSTRAINT PK_Source PRIMARY KEY (SourceID)) 
GO 

<?xml version="1.0" encoding="utf-8"?> 
<Database Name="" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007"> 
    <Table Name="Source" Member="Sources"> 
    <Type Name ="Source"> 
     <Column Name="SourceID" Member="SourceID" IsPrimaryKey="true" CanBeNull="false"/> 
     <Column Name="CreatedTime" Member="CreatedTime" />  
    </Type> 
    </Table> 
</Database> 

しかし、これは次の例外を生成します。

列または協会CreatedTime 'のマッピングには、' Source 'タイプの対応するメンバーがありませんでした。 上記のルートタイプのメンバーをマッピングすることはサポートされていません。

私のパーシスタンス層のコンテキスト内で、私は継承階層をそのまま表現しようとしていませんが、私のアプリケーションのコンテキスト内では、すべての自分のドメインオブジェクトに必要なプロパティを提供するために基本クラスを使用しています。私のマッピングファイル(監査欄を基底AbstractAuditableEntityタイプにマッピングすることを含む)で多くの手間をかけて読んでいると、私は非常に厳しいORMタスクとして認識していることを達成することができません。

ご意見やご提案は大歓迎です! ありがとう

答えて

1

KellyはLinq-to-SQLの基本的な制限の1つに当てはまりました。

データベースのテーブルマップを多かれ少なかれ1:1のドメインオブジェクトにマップすると効果的です。しかし、これはもはや事実ではありませんが、弱くて余分な作業が増えます。このような場合には

は、できるだけ早くあなたがドメインオブジェクトの継承とデータベーステーブルにマッピングする必要があり、他のものを持っているとして、あなたが最善の策だと、代わりにADO.NET Entity Frameworkのをチェックアウトすることです。EFはこれらのことを処理するように特別に設計されています。もしあなたが "私はマップのオブジェクトが必要です......"と思ったら、EFを考えるべきです! :-)

.NET 3.5 SP1の現在のEF出荷は厄介で厄介ですが、.NET 4.0ウェーブの一部であるEF 4(2009年末までに出荷予定)それらの疣贅の非常に多くを解決する必要があります!

EF4が私たちにもたらすもののいくつかのティーザーについては、ADO.NET Entity Framework team blogをチェックしてください!

マルク・

+0

は、私はまだ簡単になって「ORM」の表に、単純な派生クラスをマッピングする;-)ことができないの衝撃の下で動揺しています。私が必要としたのは、あなたが今提供しているこれを達成できなかったという確認でした。ありがとう。 私が最終的に達成しようとしていたソリューションはKellyにもありがたいですが、ベースクラスでIAuditableプロパティを実装するLinq-to-SQLのコンテキスト内では不可能です –

5

Ruby on Rails updated_on,created_onのような監査フィールドをエミュレートしようとしていると推測しています。

public interface IAuditable 
{ 
    DateTime CreatedOn { get; set; } 
    string CreatedBy { get; set; } 
    DateTime? ChangedOn { get; set; } 
    string ChangedBy { get; set; } 
} 

そしてデータの部分クラスを拡張:もしそうなら、ここで私は、私はそうのようなモデルの名前空間のインターフェイスを実装し http://weblogs.asp.net/stevesheldon/archive/2008/02/23/a-method-to-handle-audit-fields-using-linq-to-sql.aspx

出発点としてこの記事を使用して似たような達成方法ですこれらのフィールドを持っていたエンティティ:その後、

public partial class DataModelIWantToAudit : IAuditable 
{ 
} 

とは、LINQのの魔法でインタフェースの実装を確認するためにDataContextSubmitChangesをオーバーライド:

public override void SubmitChanges(ConflictMode failureMode) 
{   
    //Updates 
    foreach (var updatedModel in GetChangeSet().Updates.OfType<IAuditable>()) 
    { 
     updatedModel.ChangedOn = DateTime.Now; 
     updatedModel.ChangedBy = Membership.GetUser().UserName; 
    } 

    //Inserts 
    foreach (var insertedModel in GetChangeSet().Inserts.OfType<IAuditable>()) 
    { 
     insertedModel.CreatedOn = DateTime.Now; 
     insertedModel.CreatedBy = Membership.GetUser().UserName; 
    } 

    base.SubmitChanges(failureMode); 
} 

-Kelly

関連する問題