web-dev-qa-db-ja.com

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

私の理解するところでは、[NotMapped]属性は現在CTPに入っているEF 5まで利用できないので、本番では使用できません。

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

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

284
Raheel Khan

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.DataAnnotationsnamespaceに含まれています。

OnModelCreatingクラスのDBContext関数をオーバーライドするFluent APIで代わりにこれを行うことができます。

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

http://msdn.Microsoft.com/ja-jp/library/hh295847(v = vs103).aspx

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


編集SEP 2017

Asp.NETコア(2.0)

データアノテーション

あなたがasp.netコアを使っているなら(この記事を書いている時点では2.)、[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; }
}

流暢な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; }
}
558
Shyju

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

33
Shane