Entity Framework 4.1 Code Firstのクラスプロパティを無視する


299

私の理解では、この[NotMapped]属性は現在CTPにあるEF 5まで利用できないため、本番環境では使用できません。

EF 4.1のプロパティを無視するようにマークするにはどうすればよいですか?

更新:私は何か他の奇妙なことに気づきました。私は[NotMapped]属性を機能させましたが、何らかの理由で、EF 4.1はでpublic bool Disposed { get; private set; }マークされていても、データベースにDisposedという名前の列を作成します[NotMapped]。クラスIDisposeableはもちろん実装しますが、それがどのように重要であるかはわかりません。何かご意見は?



Entity Framework 4.1にも当てはまるようです。:このリンクをチェックsocial.msdn.microsoft.com/Forums/eu/adodotnetentityframework/...
ilmatte

1
@SamLeach:私は自分の質問を投稿する前にその質問を読みましたが、解決策は見つかりませんでした。問題は、EF4で同じことを達成する方法ですか?その投稿で何かを見逃しましたか?
Raheel Khan、2012

私もEF 4.1を使用していて、属性を確認できるので、これも同様に考えました。しかし、EFは私のアプリケーションでそれを完全に無視して非常に満足しています。これは、ネイティブおよび参照型だけでなく、MS Office intreropアプリケーションなどのcom参照型にも当てはまります。
Raheel Khan、2012

申し訳ありませんが、今、簡単なアプリケーションでテストを行ったところ、動作しました。サンプルコードを提供できますか?
ilmatte

回答:


594

NotMapped属性データ注釈を使用して、特定のプロパティを除外するようにCode-Firstに指示できます

public class Customer
{
    public int CustomerID { set; get; }
    public string FirstName { set; get; } 
    public string LastName{ set; get; } 
    [NotMapped]
    public int Age { set; get; }
}

[NotMapped]属性はSystem.ComponentModel.DataAnnotations 名前空間に含まれています。

あるいは、クラスの関数をFluent APIオーバーライドOnModelCreatingすることでこれを行うことができますDBContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<Customer>().Ignore(t => t.LastName);
   base.OnModelCreating(modelBuilder);
}

http://msdn.microsoft.com/en-us/library/hh295847(v=vs.103).aspx

私がチェックしたバージョンはです EF 4.3。これは、NuGetを使用するときに利用できる最新の安定バージョンです。


編集2017年9月

Asp.NET Core(2.0)

データ注釈

asp.netコア(この記事の執筆時点では2.0)を[NotMapped]使用している場合、 属性はプロパティレベルで使用できます。

public class Customer
{
    public int Id { set; get; }
    public string FirstName { set; get; } 
    public string LastName { set; get; } 
    [NotMapped]
    public int FullName { set; get; }
}

Fluent API

public class SchoolContext : DbContext
{
    public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
    {
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Customer>().Ignore(t => t.FullName);
        base.OnModelCreating(modelBuilder);
    }
    public DbSet<Customer> Customers { get; set; }
}

3
ありがとう。彼らの後ろの努力で答えを見るのは常に良いことです。私は実際には別の答えを正解としてマークする前の最後の行に気づきませんでした。あなたの答えは以前に来たので、私はあなたの答えを修正するために変えるのは公正だと思います。@ilmatteは気にしないでしょう。
Raheel Khan、2012

13
EFのv5>では、これらはSystem.ComponentModel.DataAnnotations.Schemaに存在します
Daveo

FluentMAppingを使用すると、NULLがわかっていても、フィールドは結果セットに返されます。返却されないようにするにはどうすればよいですか?
ロドニー

8
[NotMapped]を使用すると、他のシリアライザ(JSON / XMLなど)にもこのプロパティをマップしないように指示します。データベーステーブルへのマッピングを防止するだけで、シリアライザがプロパティにアクセスできるようにする場合は、OnModelCreatingアプローチを使用する必要があります。
maxmantz 2016

私は正確に方法を理解していませんが、エンティティフレームワーク6+で継承されたプロパティでは機能しません。属性と
Fluent

35

EF 5.0以降では、System.ComponentModel.DataAnnotations.Schema名前空間を含める必要があります。


2
これはまだ事実ですか?私はEF 6.0を使用していますが、これは少なくとも私のプロジェクトには当てはまりません。私がすでにどこかで上記を参照している名前空間を参照していない限り。
JARRRRG 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.