Проверка сущности передового опыта в ASP.NET MVC и ADO.NET Entity Framework

.net asp.net-mvc entity-framework validation

Вопрос

Я использую ASP.NET MVC и ADO.NET Entity Framework в проекте. Я хочу добавить логику проверки в мои сущности через частичные классы. Он работает аналогично тому, как показано в приложении NerdDinner.com ASP.NET MVC, которое использует LINQ2SQL. Основное отличие состоит в том, что мне нужно использовать событие OnPropertyChanging вместо OnValidating, как в LINQ2SQL.

При таком способе возникают некоторые проблемы: - Событие «OnPropertyChanging» не является оптимальной точкой вызова логики проверки, поскольку оно всегда срабатывает даже при создании вызова конструктора по умолчанию. Это действительно может вызвать серьезные проблемы (не только проблемы с производительностью). - Вместе с платформой MVC возникают проблемы при использовании EntityState.Detached (я не мог найти другой способ), чтобы определить, должна ли сущность быть проверена или нет. Поскольку сущность теряет свое состояние сущности во время ее отображения в представлении (потому что в POST-событии новый объект сущности создается вместо возврата исходного).

У меня вопрос: есть ли лучший способ добавить проверку в ADO.NET Entities? Я не смог найти никаких учебных пособий, использующих практический способ добавления валидации в объекты ADO.NET.

Популярные ответы

Лично я не ставлю проверки в самих объектах. Я использую библиотеку xVal для обработки моей проверки сущности.

xVal рекомендует вам аннотировать ваши классы сущностей (или, фактически, сопутствующие классы метаданных) атрибутами, которые описывают различные правила валидации. Эти атрибуты проверки являются стандартными, которые поставляются с .NET в System.ComponentModel.DataAnnotations.

Затем вы запускаете проверку ваших объектов вручную на бизнес-уровне. Это делается с помощью метода, который запускает логику проверки System.ComponentModel.DataAnnotations. Я написал один, который выглядит так:

/// <summary>
/// Gets the validation errors for the passed in object by using reflection to retrieve the 
/// <see cref="ValidationAttribute"/>s placed on its properties or on the properties of the object's
/// metadata class (as specified by a <see cref="MetadataTypeAttribute"/> placed on the object's class)
/// </summary>
/// <param name="instance">The object to validate</param>
/// <returns>Any validation errors</returns>
/// <remarks>
/// Borrowed (and cleaned up) from
/// http://goneale.com/2009/03/04/using-metadatatype-attribute-with-aspnet-mvc-xval-validation-framework/
/// </remarks>
public static IEnumerable<ErrorInfo> Validate(object instance)
{
    //Try to get the MetadataType attribute from the object
    MetadataTypeAttribute metadataAttrib = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault();

    //If the MetadataType attribute existed, get the metadata class
    //else just use the class of the object
    Type buddyClassOrModelClass = metadataAttrib != null ? metadataAttrib.MetadataClassType : instance.GetType();

    IEnumerable<PropertyDescriptor> buddyClassProperties = TypeDescriptor.GetProperties(buddyClassOrModelClass).Cast<PropertyDescriptor>();
    IEnumerable<PropertyDescriptor> modelClassProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast<PropertyDescriptor>();

    //This query matches each property on the model class against the buddy class
    //gets a list of all invalid validation attributes and returns a list of
    //validation errors
    return from buddyProp in buddyClassProperties
           join modelProp in modelClassProperties on buddyProp.Name equals modelProp.Name
           from attribute in buddyProp.Attributes.OfType<ValidationAttribute>()
           where !attribute.IsValid(modelProp.GetValue(instance))
           select new ErrorInfo(buddyProp.Name, attribute.FormatErrorMessage(String.Empty), instance);
}

xVal предоставляет аккуратный тип исключений, который вы можете генерировать, который инкапсулирует ошибки валидации и позволяет легко добавлять их в ModelState в вашем контроллере.

xVal также автоматически сгенерирует код проверки формы JavaScript на стороне клиента, используя jQuery.Validate, предоставив метод HtmlHelper.

Проверьте http://blog.codeville.net/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/ для пошагового руководства о том, как это работает. Я нашел, что это очень хороший способ сделать проверку, которая не является общей работой. Это вписывается в ASP.NET MVC способ делать вещи.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow