遵循NerdDinner教程,不要允许重复

时间:2010-03-09 20:07:11

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

我的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则需要编辑。但是,它无法“找到自己”并创建规则违规。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

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

您还可以将此与强制列唯一性的数据库约束结合使用 - 非空列上的唯一索引可以正常工作。

答案 1 :(得分:1)

尝试:

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

即使在entity.id == null。

时,它也适用于新实体或现有实体