【发布时间】:2025-12-20 11:55:17
【问题描述】:
我正在使用 Code First 自动生成我的数据库,并且效果很好,当我添加一些测试数据时,会按预期生成一个 Orders 表和一个 OrderLines 表。
我有以下Order 类:
public class Order
{
public int OrderID { get; set; }
public void AddItem(string productCode, int quantity)
{
var existingLine = OrderLines.FirstOrDefault(x => x.ProductOption.ProductCode == item.ProductCode);
if (existingLine == null)
OrderLines.Add(new OrderLine { ProductOption = item, Quantity = quantity });
else
existingLine.Quantity += quantity;
}
public void RemoveItem(string productCode)
{
OrderLines.Remove(OrderLines.Where(x => x.ProductOption.ProductCode == productCode).FirstOrDefault());
}
public virtual ICollection<OrderLine> OrderLines { get; set; }
public Order()
{
OrderLines = new List<OrderLine>();
}
}
我真正想要的是封装 OrderLines 集合,使该类的消费者无法直接向其中添加和删除项目(使用 ICollection 的 Add / Remove 方法),而是强迫他们使用我自定义的AddItem 和RemoveItem 方法。
通常我可以将集合设为私有,但我不能这样做,因为它需要是虚拟的,EF 才能正确创建 OrderLines 表/外键。
This answer 似乎暗示创建属性internal 可以解决问题,但我尝试了,在这种情况下没有创建OrderLines 表。
有什么方法可以实现,或者我应该以某种不同的方式设计它?非常感谢任何帮助!
更新
经过一番搜索,我找到了this question,它比我的表述更清楚;但是,它仍然没有答案。海报确实链接到this post,这似乎表明它不能以我想的方式完成,但有人有更多最新信息吗?
【问题讨论】:
标签: entity-framework-4 asp.net-mvc-3 encapsulation code-first