2016-12-09 63 views
3

問題域EF代理和複雜的數據結構

說我有一個看起來像這樣的實體...

public class HierarchyObject 
{ 
    [Key] 
    public int Id { get; set; } 
    [ForeignKey("Parent")] 
    public int ParentId { get; set; } 
    public virtual HierarchyObject Parent { get; set; } 
    public virtual ICollection<HierarchyObject> Children { get; set; } 
} 

好現在,我使用EF所以我可以簡單地做像...

var ctx = new MyContext(); 
var getAll = ctx.HierarchyObjects.AsQueryable(); 

現在可以說,我的權限添加到這些對象,使某些用戶只能做這些對象我migh的一個子集的基本CRUD操作t現在做類似...

getAll = getAll().Where(o => o.Permissions.Any(p => p.Read && UserId == currentUserId)); 

這隻返回用戶可以訪問的項目。

現在我想在可查詢端點的後面公開這個,可以說OData。

的OData將讓我寫這樣的網址...

〜/原料藥/ HierarchyObject?$展開=兒童

...已經做,我只是打破了我的安全因爲EF代理不知道我的權限規則,因爲結果將是「我有權訪問的所有對象及其子項」,真正的問題應該是「我可以訪問的所有對象都擴展到我有權訪問的所有子項至」。

所以我的問題是

有沒有辦法告訴EF是爬行,孩子財產也應該適用於where子句...

o.Children = o.Children.Where(o => o.Permissions.Any(p => p.Read && UserId == currentUserId)); 

...和應用,當無論何時「代理」其中的一個,我的所有Heirarchy對象都會統治嗎?

更多細節

我發現這一點:

How can I dynamically customize a POCO proxy in EF 4?

一切都很好,ssays我想要做的EF4是不可能的,但我使用EF6,所以我認爲微軟/別人可能已經找到了一種方法,現在允許一種體面的方式以某種方式攔截/重寫代理創建過程,或許使用類型IDbSet作爲規則鉤子的驅動程序,該規則鉤子允許您定義一些代理規則以某種方式進行關係爬網但我還沒有找到任何東西!

回答

1

所以事實證明,我對此做了錯誤的處理。 而不是代理對象,以防止relatinship爬行我發現我可以通過使用EF過濾器類型限制返回的實體。

在Nuget上有很多這樣的包,它們在運行任何業務邏輯代碼之前擴展了EF功能,基本上給出了一個上下文敏感的「db的剪切」。