#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:
Я использовал его для дополнения моих сгенерированных классов вычисляемыми значениями, когда я бы предпочел, чтобы в базе данных не было вычисляемых столбцов.