我的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时查找违规。但是,它不能“找到自己”并创建一个违反规则的规则。我该怎么做呢?
发布于 2010-03-10 04:24:05
尝试:
db.subcontracts.Count(s => (s.subcontract_no == subcontract_no)
&& (s.id != actually_edited_or_created_contract.id)).Count它将处理新的或现有的实体,即使在entity.id ==为空时也是如此。
发布于 2010-03-10 04:19:23
首先,在编辑/更新页面上,如果该值不能更改,则不要将其显示为可编辑的值。您可能希望在操作中返回一个ViewModel,从DB中检索相应的模型,并使用带有排除不可变字段的限制的TryUpdateModel。其次,在验证代码中,当更改类型为Update (而不是Insert)时,忽略检查重复的分包合同编号。在此基础上增加一些代码,这些代码与subcontract属性的属性更改处理程序绑定在一起,如果subcontract已经具有(非初始)值,并且您试图更改它,则该处理程序将抛出异常。这将防止除非在插入时才设置该值,并允许您跳过更新时的验证检查。
您还可以将其与强制列的唯一性的DB约束结合使用--非null列上的唯一索引将起作用。
https://stackoverflow.com/questions/2412179
复制相似问题