【发布时间】:2013-01-14 12:32:54
【问题描述】:
有没有办法指定实体允许的最大相关记录数?例如,对于每个 Order 实体,我想指定一个约束,即它最多有五个 orderItem。
我是否必须使用 sql 或者 fluent api 或 ef 属性中有什么可以提供帮助?
【问题讨论】:
标签: entity-framework
有没有办法指定实体允许的最大相关记录数?例如,对于每个 Order 实体,我想指定一个约束,即它最多有五个 orderItem。
我是否必须使用 sql 或者 fluent api 或 ef 属性中有什么可以提供帮助?
【问题讨论】:
标签: entity-framework
我认为“每个订单最多五个 orderItems”是业务需求。此类要求不应由基础架构(映射)或 sql 实现(尽管我不确定您的意思是什么,我将其视为数据库逻辑)。导致验证的属性可能没问题,但我认为它没有任何属性。
您应该以类似于所有其他业务规则的方式实现验证和反馈。在映射(如果可能的话)或数据库约束中实现的规则将需要第二个验证机制,可能会捕获异常,这很难看。
除此之外,这条规则有一天可能会改变,甚至可能是暂时的(圣诞节?)。那么你不希望这条规则的实现分散在各个应用层。
我会在服务类或存储库或 Order 类本身的某个 AddItem 方法中实现该规则,并使最大值可配置。
【讨论】:
我会像这里所做的那样处理这个问题:
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
}
}
}
【讨论】: