2010-03-09 57 views
0

我的sql数据库不允许添加2个记录相同的数字。如果我尝试使用先前使用的号码创建记录或编辑记录以使用先前使用的号码,则不允许使用该号码,并通过转包号字段返回带有星号的编辑/创建页面。我想为此添加规则违规,以便可以显示适当的消息。我试着加入:以下NerdDinner教程,不允许重复

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发生更改,则需要编辑。但是,它不能“发现自己”并且违反规则。我怎样才能做到这一点?

回答

1

尝试:

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

它将与新的或现有的实体工作,即使entity.id == NULL。

+0

谢谢。这与我提出的解决方案几乎完全相同。 – RememberME 2010-03-09 20:30:41

1

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

您也可以将它与一个强制唯一性的DB约束耦合 - 非空列上的唯一索引将起作用。

+0

我确实想让他们编辑该字段。我只是不希望他们能够将价值改变为其他记录存在的价值。 我已经将它设置为数据库中的唯一字段。它不允许保存它,我只是想让用户解释为什么。 我想我已经想出了一个解决方案。我只需要尝试一下。 – RememberME 2010-03-09 20:24:01