2012-06-02 66 views
2

我在我的web項目上使用3層體系結構。 DAL - > EF 4包裝與經典的CRUD方法(AddEntity,RemoveEntity adn等) BAL - >業務邏輯和查詢公開(selectByName,byCity,bySomeOtherProperty)。 UI - Aspx頁面3層應用程序 - 導航屬性

我的問題是關於由EF公開的navigationProperty。如果我有一個CustomerRepostiory,ASPX身邊,我不想讓實體上不屬於客戶操作,假設follwing POCO類:

public class Customer 
{ 
    public int Id {get; set;} 
public string Name {get; set;} 
public ICollection<Orders> Order{get;set;} 
} 

和ASPX你執行這樣的事情:

var customer = bll.getCustomerByName("alex"); 
customer.Order.Add(new ..) // BAD, I don't want allow it 

我該怎麼辦?也許我必須創建一個poco類包裝器才能「隱藏」一些屬性? 哪個方法最好?

+0

爲什麼你不希望允許這樣做?是否因爲你想限制在UI層可以做什麼?爲什麼你的情況不好? –

+0

是的,我想回顧在UI層可以做什麼。此外,我的BLL包含插入,刪除,更新和保存方法,因此他們是CRUD操作的唯一責任人。每個命令都需要進行一些驗證,如果您使用navigationProperty添加一些內容,則無法執行任何控件。你必須通過Insert方法。 – bit

回答

2

暴露你的集合作爲IEnumerable代替,這樣的集合將被只讀

你將不得不做這樣的事情:

class Customer 
{ 
    private List<Order> orders(); 
    Customer() 
    { 
     this.orders = new List<Order>(); 
    } 

    public IEnumerable<Order> Orders { get { return this.orders.AsEnumerable(); } } 

    // you will need a public method to mutate the collection 

    public void AddOrder(Order order) 
    { 
     // implement custom logic, fire domain events, etc 
     this.orders.Add(order); 
    } 
} 

編輯:

如果你不能修改您的實體(這對我來說似乎很奇怪)您可以嘗試使用ObservableCollection<>

東西這樣

class MyCustomer : Customer 
{ 
    private ObservableCollection<Order> orders; 
    internal bool AllowMutateCollection; 
    public MyCustomer() 
    { 
     this.Orders = this.orders = new ObservableCollection<string>(); 
     this.orders.CollectionChanged += (_, __) => 
     { 
      if(!this.AllowMutateCollection) 
      { 
      throw new NotImplementedException(); 
      } 
     }; 
    } 
} 

現在,你將不得不設置AllowMutateCollection時,你會允許你的突變實體,成爲一個真正的痛苦,也許這將是一些錯誤的原因......我不推薦它

但是我會強烈建議您重新定義一點點你的設計,包裝類和暴露的IEnumerable代替,這將是更清潔和更容易維護

檢查這個問題

Fire an event when Collection Changed (add or remove)

+0

我不想要,因爲每次我需要更新(重新生成)POCO類Visual Studio都會覆蓋我的修改,導航屬性將再次成爲ICollection類型。 – bit

+0

您的「客戶」類是否自動生成? – Jupaol

+0

是的。客戶是自動生成的。 – bit

1

寫了客戶的子類,覆蓋訂單,使吸氣作事訪問權限檢查你想