大佬教程收集整理的这篇文章主要介绍了asp.net-mvc – 何时公开IEnumerable而不是ICollection?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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的导航.@R_136_9447@接到用户的订单.这看起来很酷.但是,我可以在Controller中向用户添加新订单,而无需使用服务或存储库.
它是在控制器级别上操纵数据.这是反模式吗?
你的意思是你可以这样做(假设有一个用于向用户添加订单的视图模型和某个地方的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?全部内容,希望文章能够帮你解决asp.net-mvc – 何时公开IEnumerable而不是ICollection?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。