【问题标题】:Following NerdDinner tutorial, don't allow duplicate按照 NerdDinner 教程,不允许重复
【发布时间】:2010-03-09 20:07:11
【问题描述】:

我的 sql 数据库不允许添加相同编号的 2 条记录。如果我尝试使用以前使用的号码创建记录或编辑记录以使用以前使用的号码,它不允许这样做并返回到编辑/创建页面,并在分包合同号码字段旁带有星号。我想为此添加规则违规,以便显示适当的消息。我试着添加这个:

 if (db.subcontracts.Count(s => s.subcontract_no == subcontract_no) > 0)
      yield return new RuleViolation("Subcontract number already exists", "subcontract_no");

写这篇文章时,我只想到 Create 方法。这里的问题是每次我编辑记录时都会发现违规,即使 subcontract_no 没有更改。所以,我想我需要它在创建记录时以及在更改 subcontract_no 时进行编辑时找到违规行为。但是,它不能“找到自己”并创建违反规则的行为。我该怎么做?

【问题讨论】:

    标签: asp.net-mvc linq-to-sql nerddinner


    【解决方案1】:

    试试:

    db.subcontracts.Count(s => (s.subcontract_no == subcontract_no) 
        && (s.id != actually_edited_or_created_contract.id)).Count
    

    它适用于新的或现有的实体,即使 entity.id == null。

    【讨论】:

    • 谢谢。这与我提出的解决方案几乎相同。
    【解决方案2】:

    首先,在您的编辑/更新页面上,如果值无法更改,请不要将其显示为可编辑值。您可能希望在操作中取回 ViewModel,从数据库中检索相应的模型,并使用带有排除不可变字段的限制的 TryUpdateModel。其次,在您的验证代码中,当更改类型为更新(而不是插入)时,省略对重复分包合同号的检查。如果分包合同编号已经具有(非初始)值并且您尝试更改它,则使用一些与分包合同编号属性的属性更改处理程序相关联的代码来增强此功能,该处理程序将引发异常。这应该可以防止在插入时设置值,并允许您跳过更新时的验证检查。

    您还可以将此与强制列具有唯一性的数据库约束相结合——非空列上的唯一索引将起作用。

    【讨论】:

    • 我确实希望允许他们编辑该字段。我只是不希望他们能够将值更改为存在于另一条记录中的值。我已经将它设置为数据库中的唯一字段。它不允许保存它,我只想让用户解释原因。我想我已经想出了一个解决方案。我只需要尝试一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2015-02-03
    相关资源
    最近更新 更多