Подтвердить что ты не робот

Установка атрибутов свойства в частичных классах

У меня есть класс сотрудника, созданный Entity Framework (EF).

public partial class employee
{
    private string name;
    public string Name
    {
        get{return name;}
        set{ name = value;}
    }
}

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

Мой написанный частичный класс находится в том же пространстве сборки и имени.

public partial class employee
{
    // What should I write here to add required attribute in the Name property?
}
4b9b3361

Ответ 1

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

Пример класса buddy:

using System.ComponentModel.DataAnnotations;

[MetadataType(typeof(EmployeeMetadata))]
public partial class Employee
{
  private class EmployeeMetadata
  {
     [Required]
     public object Name; // Type doesn't matter, it is just a marker
  }
}

Ответ 2

Вы не можете, насколько мне известно, это просто невозможно.

Вам следует посмотреть, есть ли MVC3 способ добавления атрибутов в другом месте (например, к типу), которые относятся к другому свойству.

В качестве альтернативы вы можете добавить свойство проксирования:

[ValidationAttributesHere]
public string ValidatedName
{
    get { return Name; }
    set { Name = value; }
}

Ответ 3

Другой способ сделать это:

private class EmployeeMetadata
{
    //the type HAS to match what your have in your Employee class
    [Required]
    public string Name { get; set; }
}

public partial class Employee : EmployeeMetadata
{
}

По крайней мере, это работало с Linq to SQL. Однако мне не удалось получить доступ к атрибутам через GetCustomAttributes (даже при использовании System.Attribute.GetCustomAttributes, похоже, не помогло). Тем не менее MVC соблюдали эти атрибуты. Кроме того, это не будет работать с наследованием от интерфейсов. Передача атрибутов из интерфейса будет работать только с использованием атрибута MetadataType class (см. ответ Ладислава Мрнки).