我应该使用实体框架实体部分类

本文关键字:实体部 分类 框架 实体 我应该 | 更新日期: 2023-09-27 18:10:22

我首先使用EF 4.1数据库。我想知道什么样的事情我可以使用实体部分类。我可能想要添加到部分类中的一些可能的功能示例是什么?我只是想了解我是否应该让我的实体更有能力,或者我是否应该在其他地方添加功能?对于我想要添加到实体中的东西,是否存在好的情况?

例如,我有一个实体,它具有开始和结束日期的各种子属性。这些日期不能重叠。这是我应该对父实体强制执行的吗?


好的,所以建议似乎是验证和业务逻辑。另外计算的东西,使数据库没有计算列。


我应该将业务逻辑绑定到实体框架实体吗?如果我想离开英孚呢?

感谢

格雷姆

我应该使用实体框架实体部分类

Validatable Objects和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,并确保任何通过它的验证步骤的Apple都不会显示为蓝色。

编辑

作为一个使用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有计算列时,我使用它来增加我生成的类的计算值。