未加载实体的关联属性以进行服务器端验证

时间:2010-10-21 08:51:21

标签: silverlight-4.0 wcf-ria-services

考虑以下情况。我有一个名为 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对象?

1 个答案:

答案 0 :(得分:0)

不幸的是,当它在服务器上找到你时,你对对象图的状态没有任何保证。 RIA优化了所有内容,因此您只能看到已修改的实体。一种解决方案是使用组合物。它将确保整个图形传递,但它有其他可能不是你想要的效果。另一种选择是在更新方法中对图形进行水合,然后执行验证,并根据需要抛出ValidationException。