asp.net-mvc - 何时公开 IEnumerable 而不是 ICollection?

标签 asp.net-mvc entity-framework ef-code-first repository-pattern

public class Order
{
 public int Id {get;set;}
 [DisplayName("User")]
 public long UserId { get; set; }
 [ForeignKey("UserId")]
 public virtual User User { get; set; }
 public decimal Amount { get; set; }
}

IEnumurable
public class User
{
 public int Id{get;set;}
 public virtual IEnumerable<Order> Orders { get; set; } 
}

public User GetWithOrders()
{
 var myUser=UserRepository.GetByEmail("email@email.com");
 myUser.Orders=OrderRepository.GetByUserId(myUser.Id);
 return myUser;
}

ICollection
public class User
{
 public int Id{get;set;}
 public virtual ICollection<Order> Orders { get; set; } 
}

public User GetWithOrders()
{
 var myUser=UserRepository.GetByEmail("email@email.com");
 return myUser;
}

我没有使用 IEnumerable 进行延迟加载对于导航属性。因此,我必须通过另一个查询来获取该用户的订单。

我有 ICollection 的导航.所以我可以收到用户的订单。这看起来很酷。但随后我可以在 Controller 中向用户添加新订单,而无需使用服务或存储库。

这是一种在 Controller 级别上操纵数据的方式。这是反模式吗?

最佳答案

But [with ICollection] I can add new order in Controller without using service or repository.



你的意思是你可以这样做(假设有一个 View 模型用于向用户添加订单和一个 SaveChanges() 某处):
public class UserController
{
    public ActionResult AddUserOrder(AddUserOrderModel addOrder)
    {
        User user = User.GetByEmail(addOrder.UserEmail);        
        user.Orders.Add(addOrder.Order);
        User.SaveChanges();
    }
}

尤其是你可以做user.Orders.Add(...) ,那么这是从服务或存储库层公开实体类型的副作用。

如果您想避免这种情况,您必须定义并公开一个包含您要公开的成员的业务对象:
public class UserBLL
{
    public int Id { get; private set; }
    public IEnumerable<Order> Orders { get { return _orders.AsEnumerable(); } }
    private IEnumerable<Order> _orders;

    public UserBLL(User user)
    {
        Id = user.Id;
        _orders = user.Orders;          
    }

    public void AddOrder(Order order)
    {
        _orders.Add(order);
    }
}

关于asp.net-mvc - 何时公开 IEnumerable 而不是 ICollection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30378877/

相关文章:

asp.net-mvc - MVC 4 中的过滤和分页

css - Bootstrap header overlap main Body div 用于响应式网页设计

javascript - 使用 Google Map Api 时出现错误。 Google Api key 无权使用此 api

asp.net-mvc - ASP.NET MVC 4 + EF5 beta2 + DbGeography 类型 + MiniProfiler 抛出错误

c# - 阻止 EF 检查模型

css - 奇怪 -- 网页上的文本在 asp.net 身份验证后加粗

c# - Web 开发期间的自动映射器与手动映射

c# - 接口(interface)中的 ICollection 与另一个接口(interface)作为类型

c# - 如何将此 Linq 查询语法转换为方法语法?

c# - 如何更新 Entity Framework 中的相关实体