2

タイトルと同じように、DB列にマップされない(データベースが最初に作成された)POCOの1つに追加のプロパティを追加できますか?永続化されません。このプロパティはアプリケーション内でのみ使用され、永続化する必要はありません。Entity Framework Code Firstを使用している場合、データベーステーブルにマップされていないクラスにプロパティを追加することは可能ですか?

プロパティを通常どおり定義するほか、これを達成するために余分な対策がありますか?

答えて

4

はい、あなたはそれを絶対に行うことができます。ここで私が持っているコンフィギュレーションクラスからの例です:

public class ForCommentEntities:EntityTypeConfiguration<Comment> { 
    public ForCommentEntities(String schemaName) { 
     this.HasRequired(e => e.SystemUser) 
      .WithMany() 
      .Map(m => m.MapKey("SystemUserID")); 
     this.Ignore(e => e.Remarks); 
     this.ToTable("Comment", schemaName); 
    } 
} 

this.Ignore呼び出しは重要な部分です。あなたのクラスのプロパティの1つにラムダ式を取ります。これは、あなたのPOCOから設定の詳細を保持するので、EFCFを偉大なものにする(IMO)の一部です。

設定クラスは、あなたのContextでこのように使用されます:

protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
    base.OnModelCreating(modelBuilder); 

    var schemaName = Properties.Settings.Default.SchemaName; 
    modelBuilder.Configurations 
     .Add(new Configuration.ForCommentEntities(schemaName)) 
     // ...other configuration options here 
    ; 
} 
+1

ありがとうございました。あなたはあなたのForCommentEntitiesクラスに関するいくつかの情報を提供できますか?同等のクラスはどこで作成しますか?または、ModelBuilder.Entityを使用してOnModelCreating内で明示的に行うことができますか?().Ignore(i => i.myProp);? – stephen776

+1

あなたはこれまで述べたように、インラインで実行することもできます。 'ForCommentEntities'クラスはどこにでも置くことができます。それは単純なクラスです。それはEFCF 4.1アセンブリにアクセスする必要があり、あなたの 'Context'クラスはそれを参照できる必要があります。私の設定は、クラスを使用すると操作が簡単になるほど長くなります。 – Yuck

+0

よろしくお願いします! – stephen776

1

コードファーストとPOCOについての素晴らしい部分はあなたが今マッパーを必要とせずにEFで使用されたビジネス・オブジェクトを持つことができています( AutoMapperやあなた自身のもの)。また、あなたのオブジェクトをEF属性などで飾る必要がないことを意味します(したがって、上記のYuckの答え)。ただし、オブジェクトにメソッドやプロパティを追加できるという利点もあります。例としてはコレクション(住所など)があり、並べ替えやフィルタリングされた投影が必要です。 SaveChange()を呼び出す前にビジネスルールの検証を行うこともできます。皆さんが知っているように、可能性は無限ですが、ポイントは、データオブジェクトからデータオブジェクトを取得するビジネスオブジェクトとしてこれらのオブジェクトを使用することができます。

+0

良い説明! – stephen776

+0

もうひとつ注意しておきますが、EFはデフォルトで規約ベースのマッピングを使用します。技術的には、コンベンションがdbフィールド名と一致する限り、カスタム構成を行う必要はありません。この質問に対して、EFはdbフィールド名と一致しないプロパティを無視します。 –

関連する問題