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/