0

我的 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 时进行编辑时找到违规行为。但是,它不能“找到自己”并创建违反规则的行为。我怎样才能做到这一点?

4

2 回答 2

1

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

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

于 2010-03-09T20:19:22.820 回答
1

尝试:

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

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

于 2010-03-09T20:24:05.023 回答