質問

監査プロパティの抽象基本クラスがあります。簡潔にするために、プロパティが 1 つあるとします

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 タスクだと思われるものを達成できません。

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

役に立ちましたか?

解決

ケリーはそれを行う方法の偉大なサンプルを示した - しかし、あなたは基本的にLINQのツーSQLの制限の1をヒットしました。

。 あなたのドメインオブジェクトに1:あなたのデータベーステーブルマップ多かれ少なかれ1場合は、

これは素晴らしい作品。しかし、それは弱いだと、これはもはやケースになると、余分な作業の多くを引き起こさない。

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

現在のEFは、.NET 3.5 SP1は、そのいぼや困りごとを持っていますが、(今年2009年の年末までに出荷する必要があります).NET 4.0波の一部であるEF 4は、偉大を解決する必要がありますが中に出荷し、許可されましたこれらのいぼの多く!

<のhref = "http://blogs.msdn.com/adonet/archive/tags/Entity+Framework+Feature+CTP1+for+.NET+4.0/default.aspx" のrel = "nofollowをnoreferrerをチェック「> EF4はすべてを私たちにもたらすもののいくつかのお誘いのためのADO.NET Entity Frameworkのチームのブログで!

マルク

他のヒント

Ruby on Rails のような監査フィールドをエミュレートしようとしていると思います updated_on, created_on. 。もしそうなら、この投稿を出発点として使用して同様のことを達成した方法を次に示しますhttp://weblogs.asp.net/stevesheldon/archive/2008/02/23/a-method-to-handle-audit-fields-using-linq-to-sql.aspx

次のように Models 名前空間にインターフェイスを実装しました。

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

次に、次のフィールドを持つデータ エンティティの部分クラスを拡張しました。

public partial class DataModelIWantToAudit : IAuditable
{
}

そしてオーバーライドしました SubmitChangesDataContext Linq の魔法を使ってインターフェイスの実装を確認する OfType<>:

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);
}

お役に立てば幸いです!-ケリー

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top