2011-08-03 7 views
3

は、私はプロジェクトとタスクEFコード最初のクラスはEntity Frameworkが関連オブジェクトをいくつかの既定値で返すようにするにはどうすればよいですか?

public class Project 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public virtual ICollection<Task> Tasks { get; set; } 
    } 

    public class Task 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public int ProjectId { get; set; } 
     public bool IsDeleted {get; set;} 
     public virtual Project Project { get; set; } 
    } 

は、私はプロジェクトのクラスに私のタスクプロパティは常にIsDeletedだけのリターンに、そのフィルタを実行することを希望私は

public void SomeAction() 
{ 
Project p= repository.GetById(1); 
var tasks = p.Tasks; 
//var tasks = p.Tasks.Where(t=>t.IsDeleted==false); 
} 

があるとしていると言いますその部分集合...その場所全体にその状態を書く必要を避けるために...

推奨事項はありますか?

編集:

イムモデルデザイナではEFコードファースト

答えて

3

EFコードfirst = NO WAY。 EDMXで利用可能な機能の長いリストから1つだけです。最初は完全にコードにありません。 EDMXからのマップされた条件はこれを行いますが、ハードコーディングされているため変更できません(=別のEDMXを使用しない限り、削除したエンティティをロードすることはできません)ので、まだ問題があります。その解決策は、EFでのグローバルフィルタの実装ですが、EFでは、古いLinqとエンティティ間にリレーションシップ(DataLoadOptions.AssociateWith)があるにもかかわらず、そのようなことはありません。

これは、削除されたエンティティをアプリケーションにロードしたり、アプリケーションのメモリでフィルタリングしたりすることなく、熱心な読み込みや遅延読み込みを使用できない場合には、はるかに苦痛です。

1

を使用して、あなたのタスクエンティティを選択し、マッピングの詳細]ウィンドウを起動します。これにより、エンティティがマップされるデータベーステーブルとすべての列が表示されます。 「[YourTable]にマップする」というところのすぐ下に、<Add a Condition>というオプションが表示されます。これは、あなたが探しているもののような条件を設定する必要があります。

+1

ありがとうございました。EFコードを使用してImを明確にしてください。4.1 – ignaciofuentes

+0

自動プロパティを使用する代わりに、パブリックプロパティに割り当てられたプライベート変数を使用できます。プライベート変数にはデフォルト値が割り当てられます。 – Brownman98

5

OnModelCreatingメソッドでモデルにあなたが別のエンティティへの真のIsDeletedてマッピングしない限り、あなたは、もはや負荷は、あなたがかもしれない、(アイテムを削除することができます

modelBuilder.Entity<TEntity>().Map(m => m.Requires("IsDeleted").HasValue(false)); 

警告

  • を弁別を追加
  • pocoクラスにIsDeletedプロパティを設定することはできません(ディスクリミネータはマップできません)
  • IsDeletedをマップできないため、最初にエンティティを削除するために未処理のSQLを実行する必要があります。
+1

'' pocoクラスはIsDeletedプロパティを持つことができません(discriminatorsはマップできません) 'についてもっと説明できますか? –

関連する問題