我应该使用实体框架实体部分类应该做什么?
问题描述:
我正在使用EF 4.1数据库。我想知道我可能使用Entity Partial Classes是什么类型的东西。我可能想要添加到部分类中的可能功能的一些示例是什么?我只是想了解是否应该让我的实体更有能力,或者我应该在其他地方添加功能?对于我想要添加到实体中的事物,是否有很好的案例?我应该使用实体框架实体部分类应该做什么?
例如,我有一个实体,具有各种儿童属性的开始和结束日期。这些日期不能重叠。这是我应该强制执行的父实体吗?
好吧,所以建议似乎是验证和业务逻辑。另外计算事情,以便DB没有计算列。
我应该将业务逻辑绑定到实体框架实体吗?如果我想离开EF,该怎么办?
由于
格雷姆
答
是Validatable对象和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框架,具有这些属性将被读取自动生成标签字段的宗旨,为相应的显示器的任何模型/编辑。
使用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.");
}
}
}
答
我已经用它来增加我生成的类与计算值,当我宁愿没有DB已经计算了列。
那么主要确保实体是一件有效的事情? – GraemeMiller
任何类型的业务逻辑,真的。如果您有另一个不同类型的属性被设置并且不需要其他属性时需要一个属性,则可以通过在部分类中实现“ghost方法”来完成此操作。 –
我想我正在使用AutoMapper来制作ViewModels并且它们有显示名称。不过,我想我需要在ViewModel和Entity上强制执行所需的等。 – GraemeMiller