2011-08-03 38 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; } 
    } 

說我有

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

我想,我的任務在項目類屬性將始終請將isDeleted,只是返回執行過濾器該子集......以避免必須在整個地方編寫該條件...

任何建議?

編輯:

進出口使用EF代碼第一次

回答

3

EF代碼優先= 沒有辦法。 EDMX提供的功能列表中只有一個,它在代碼中完全缺少。從EDMX映射的條件做到這一點,但它仍然是有問題的,因爲它是硬編碼的,不能改變(=即使你想要除非你使用另一個EDMX你永遠不能加載被刪除的實體)。解決方法是在EF中實現全局過濾器,但是EF沒有類似的東西,儘管舊的Linq實體至少在關係中具有它們(DataLoadOptions.AssociateWith)。

這在關係中更加痛苦,在這種關係中,如果不將已刪除的實體加載到應用程序中,並且在應用程序的內存中執行過濾,則無法使用急切或延遲加載。

1

在模型設計器中,選擇你的任務實體,並調出映射詳細信息窗口。這應該顯示您的實體映射到的數據庫表和所有列。就在它說「映射到[YourTable]」的地方,你應該看到一個選項<Add a Condition>。這應該讓你設置一個像你要找的東西。

+1

感謝那..我應該澄清我使用EF代碼第一個4.1 4.1 – ignaciofuentes

+0

而不是使用自動屬性,您可以使用私有變量分配給公共屬性。私有變量會分配默認值。 – Brownman98

5

鑑別添加到模型中OnModelCreating方法

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

注意事項

  • 你不能再負荷刪除的項目(除非你地圖請將isDeleted真正到另一個實體,則可能丟失自動過濾)
  • poco類不能具有IsDeleted屬性(鑑別器不能被映射)
  • 因爲IsDeleted無法映射,所以需要運行原始SQL以首先刪除實體。
+1

你能解釋一下'poco類不能具有IsDeleted屬性(鑑別器不能被映射)'嗎? –