3层应用程序 - 导航属性

时间:2012-06-02 18:01:58

标签: c# entity-framework repository-pattern

我在我的网络项目中使用3层架构。 DAL - >使用经典CRUD方法的EF 4包装器(AddEntity,RemoveEntity adn等) BAL - >业务逻辑和查询公开(selectByName,byCity,bySomeOtherProperty)。 UI - Aspx页面

我的问题是关于EF公开的navigationProperty。如果我有一个CustomerRepostiory,aspx方面我不希望允许对不是Customer的实体进行操作,假设以下是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类包装器才能“隐藏”某些属性? 哪种方法最好?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

为Customer编写子类,覆盖Orders,让getter执行您想要的任何访问权限