考虑以下情况。我有一个名为 ProductSupplier 的实体,它是一个Presentation Model。它是通过执行 Products 和 Suppliers 的内部联接以及从Linq语句创建新投影来创建的。 ProductSupplier 投影还会创建一个 PartType 对象列表,它也是一个Presentation Model。
public partial class ProductSupplier
{
private IEnumerable<PartType> _partTypes;
[Key]
public int ProductSupplierKey { get; set }
[Include]
[Association("ProductSupplier_PartType", "ProductSupplierKey", "ProductSupplierKey")]
public IEnumerable<PartType> PartTypes
{
get { return _partTypes ?? (_partTypes = new List<PartType>()); }
set { if (value != null) _partTypes = value; }
}
}
public partial class PartType
{
[Key]
public int PartTypeKey { get; set; }
[Key]
public int ProductSupplierKey { get; set; }
public int PartQuantity { get; set; }
}
我希望验证没有 ProductSupplier 可以有超过10个单独的部分。这意味着属于 ProductSupplier 的所有 PartTypes 的所有PartQuantities都应该相加,总数不能超过10。
为此,我创建了一个自定义验证器:
public static ValidationResult ValidatePartTotals(ProductSupplier productSupplier, ValidationContext validationContext)
{
if (productSupplier.PartTypes.Sum(p => p.PartQuantity) > 10)
return new ValidationResult("Must be less than 10 parts total.");
return ValidationResult.Success;
}
从客户端调用验证时,此工作正常。我遇到的问题是,当验证器从服务器端运行时,IEnumerable始终为空。
我尝试将[RoundTripOriginal]添加到PartQuantity,以及各种其他属性,例如所有Key字段,但在服务器端完成时仍然是一个空列表。
如何在服务器上运行验证时访问这些PartType对象?
答案 0 :(得分:0)
不幸的是,当它在服务器上找到你时,你对对象图的状态没有任何保证。 RIA优化了所有内容,因此您只能看到已修改的实体。一种解决方案是使用组合物。它将确保整个图形传递,但它有其他可能不是你想要的效果。另一种选择是在更新方法中对图形进行水合,然后执行验证,并根据需要抛出ValidationException。