有没有办法指定实体允许的最大相关记录数?例如,对于每个Order实体,我想指定一个约束,它最多有五个orderItems。
我是否必须使用sql或者流畅的api或ef属性中有什么可以帮助?
答案 0 :(得分:3)
我认为“每个订单最多五个orderItem”是业务要求。这些要求不应该通过基础设施(映射)或sql来实现(虽然我不确定你的意思,我把它读作数据库逻辑)。导致验证的属性可能没问题,但我认为没有任何属性。
您应该以与所有其他业务规则类似的验证和反馈方式实施它。在映射中实现的规则(如果可能的话)或数据库约束将需要第二个验证机制,可能会捕获异常,这很难看。
除此之外,这条规则可能会改变一天,甚至可能暂时改变(圣诞节?)。然后,您不希望将此规则的实现分散在各种应用程序层上。
我会在服务类或存储库或Order类本身的某个AddItem
方法中实现该规则,并使其最大可配置。
答案 1 :(得分:1)
我会像这里所做的那样接近这个:
Limit size of Queue<T> in .NET?
另外:How do I override List<T>'s Add method in C#?
通过覆盖处理返回实体列表的任何内容来处理此问题,这些实体具有实现业务逻辑要求的扩展类型。如果您希望将来更改它,也可以轻松地从设置文件中控制属性。
我知道无法在EF / Fluent或SQL中执行此操作,这似乎与直觉相反,因为这是相关的业务逻辑,与您如何持久保存数据无关。 (*不是说没有我不知道的方式)
这样的事情应该有效:
public class LimitedList<T> : List<T> {
private int limit = -1;
public int Limit {
get { return limit; }
set { limit = value; }
}
private List<T> list= new List<T>();
public LimitedList(int Limit) {
this.Limit=Limit;
}
public void Add(T entry) {
if (this.Limit != list.Count) {
list.Add(entry);
} else {
//error
}
}
}