有没有办法指定实体允许的最大相关记录数?例如,对于每个 Order 实体,我想指定一个约束,即它最多有五个 orderItems。
我是否必须使用 sql 或者 fluent api 或 ef 属性中有什么可以帮助的?
有没有办法指定实体允许的最大相关记录数?例如,对于每个 Order 实体,我想指定一个约束,即它最多有五个 orderItems。
我是否必须使用 sql 或者 fluent api 或 ef 属性中有什么可以帮助的?
我认为“每个订单最多五个 orderItems”是业务要求。此类要求不应由基础架构(映射)或 sql 实现(尽管我不确定您的意思是什么,我将其视为数据库逻辑)。导致验证的属性可能没问题,但我认为它没有任何属性。
您应该以与所有其他业务规则类似的方式实现验证和反馈。在映射(如果可能的话)或数据库约束中实现的规则将需要第二个验证机制,可能会捕获异常,这很难看。
除此之外,这条规则有一天可能会改变,甚至可能是暂时的(圣诞节?)。那么你不希望这个规则的实现分散在不同的应用层上。
我将AddItem
在服务类或存储库或 Order 类本身中的某些方法中实现该规则,并使最大值可配置。
我会像这里所做的那样处理这个:
另外:如何在 C# 中覆盖 List<T> 的 Add 方法?
通过使用扩展类型覆盖处理您的返回实体列表来处理此问题,该扩展类型实现您的业务逻辑要求。如果您想在将来更改它,这也将使从设置文件中控制属性变得容易。
我不知道在 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
}
}
}