Какое использование я должен сделать из Entity Framework Entity Partial Classes?

#c# #entity-framework #entity-framework-4 #entity-framework-4.1

#c# #entity-framework #entity-framework-4 #entity-framework-4.1

Вопрос:

Сначала я работаю с базой данных EF 4.1. Мне было интересно, для каких вещей я могу использовать Entity Partial Classes . Какие примеры возможной функциональности я мог бы добавить к частичным классам. Я просто пытаюсь понять, должен ли я сделать свои объекты более способными или мне следует добавить функциональность в другом месте? Есть ли хорошие примеры для вещей, которые я, возможно, захочу добавить к своим сущностям?

Например, у меня есть объект, который имеет различные дочерние свойства с начальными и конечными датами. Эти даты не должны перекрываться. Это то, что я должен применять к родительскому объекту?


Хорошо, итак, предложения, похоже, связаны с проверкой и бизнес-логикой. Дополнительно вычисляя вещи так, чтобы в DB не было вычисляемых столбцов.


Должен ли я привязывать бизнес-логику к сущностям entity Framework? Что, если я захочу отойти от EF?

Спасибо

Грэм

Ответ №1:

Проверяемые объекты и атрибуты MetadataType используются в частичных классах, например, такими фреймворками, как MVC.

Вот пример использования атрибута MetadataType:

 [MetadataType(typeof(UserMetadata))]
public partial class User
{
    private class UserMetadata
    {
        [DisplayName("User Id")]
        public long UserId
        {
            get;
            set;
        }

        [DisplayName("User Name")]
        public string UserName
        {
            get;
            set;
        }
    }
}
  

Когда вы используете MVC framework, любая модель, имеющая эти атрибуты, будет считываться в целях автоматической генерации полей меток для соответствующих дисплеев / редакторов.

Пример использования IValidatableObject

 public partial class Apple : IValidatableObject // Assume the Apple class has an IList<Color> property called AvailableColors
{
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        foreach (var color in this.AvailableColors)
        {
            if (color.Name == "Blue") // No blue apples, ever!
            {
                yield return new ValidationResult("You cannot have blue apples.");
            }
        }
    }
}
  

MVC обнаружит этот IValidatableObject и гарантирует, что любое яблоко, которое проходит через этап проверки, никогда не будет отображаться синим цветом.

Редактировать

В качестве примера вашего диапазона дат можно привести использование IValidatableObject:

 public partial class ObjectWithAStartAndEndDate : IValidatableObject
{
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (this.StartDate >= this.EndDate)
        {
            yield return new ValidationResult("Start and End dates cannot overlap.");
        }
    }
}
  

Комментарии:

1. Итак, в основном обеспечение того, чтобы объект был действительным?

2. На самом деле, любой тип бизнес-логики. Если у вас есть одно свойство, которое требуется, когда задано другое свойство другого типа, и не требуется в противном случае, вы можете сделать это, реализовав «методы-призраки» в частичном классе.

3. Я предполагаю, что я использую AutoMapper для создания ViewModels, и у них есть отображаемое имя. Однако я полагаю, что мне нужно обеспечить соблюдение требований и т. Д. Как для ViewModel, так и для объекта.

4. Большое спасибо. Просто интересно, не могут ли сами даты дочернего объекта перекрываться. Итак, родительский объект имеет разные дочерние периоды, где я мог бы проверить, что сами дочерние периоды не могут охватывать один и тот же период?

5. Интересно, что у меня возникла эта проблема, и я работаю над библиотекой для определения дочерних объектов, которые проверяют работоспособность, чтобы избежать конфликтов диапазона дат. Я дам вам знать, когда выложу это на github.

Ответ №2:

Я использовал его для дополнения моих сгенерированных классов вычисляемыми значениями, когда я бы предпочел, чтобы в базе данных не было вычисляемых столбцов.