【问题标题】:Maximum number of related records最大相关记录数
【发布时间】:2013-01-14 12:32:54
【问题描述】:

有没有办法指定实体允许的最大相关记录数?例如,对于每个 Order 实体,我想指定一个约束,即它最多有五个 orderItem。

我是否必须使用 sql 或者 fluent api 或 ef 属性中有什么可以提供帮助?

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    我认为“每个订单最多五个 orderItems”是业务需求。此类要求不应由基础架构(映射)或 sql 实现(尽管我不确定您的意思是什么,我将其视为数据库逻辑)。导致验证的属性可能没问题,但我认为它没有任何属性。

    您应该以类似于所有其他业务规则的方式实现验证和反馈。在映射(如果可能的话)或数据库约束中实现的规则将需要第二个验证机制,可能会捕获异常,这很难看。

    除此之外,这条规则有一天可能会改变,甚至可能是暂时的(圣诞节?)。那么你不希望这条规则的实现分散在各个应用层。

    我会在服务类或存储库或 Order 类本身的某个 AddItem 方法中实现该规则,并使最大值可配置。

    【讨论】:

    • 嗨格特,好点,是的,我认为 ItemOrder 应该更具可配置性,因此不应在 sql 或映射中定义验证逻辑。您对实现接口 IValidatableObject 和使用自我验证模型有何看法?我正在考虑做一个简单的计数,如果该计数大于允许的最大值,则添加一个新的 ValidationResult。
    • 如果自我验证模型是指可以验证的 DTO 或视图模型,我认为这是一个绝妙的主意。我欢迎一切有助于集中和隔离验证逻辑的东西。
    • 是的,这正是我的意思,我认为这是一个很好的策略。感谢您的意见
    【解决方案2】:

    我会像这里所做的那样处理这个问题:

    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
         }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多