Свойства ассоциации на объекте не загружены для проверки на стороне сервера - PullRequest
0 голосов
/ 21 октября 2010

Рассмотрим следующую ситуацию. У меня есть объект с именем ProductSupplier , который является моделью презентации. Он создается путем внутреннего объединения Products и Suppliers и создания новой проекции из оператора Linq. Проекция ProductSupplier также создает список объектов PartType , который также является моделью представления.

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 отдельных частей . Это означает, что все PartQuantities для всех PartTypes , которые принадлежат ProductSupplier , должны быть суммированы, и общая сумма не может превышать 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 голосов
/ 22 октября 2010

К сожалению, у вас нет никаких гарантий относительно состояния графа объектов, когда он попадает к вам на сервер. RIA оптимизирует вещи так, что вы увидите только измененные объекты. Одним из решений будет использование композиции. Это гарантирует, что весь график будет передан, но у него есть другие эффекты, которые могут не соответствовать вашим ожиданиям. Другой вариант заключается в том, чтобы увлажнить график в вашем методе обновления, затем выполнить проверку и при необходимости вызвать ValidationException.

...