【问题标题】:What uses should I make of Entity Framework Entity Partial Classes?我应该如何使用实体框架实体部分类?
【发布时间】:2023-04-11 02:26:02
【问题描述】:

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

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


好的,所以建议似乎是验证和业务逻辑。另外计算一些东西,以便 DB 没有计算列。


我应该将业务逻辑绑定到实体框架实体吗?如果我想离开 EF 怎么办?

谢谢

格雷姆

【问题讨论】:

    标签: c# entity-framework entity-framework-4 entity-framework-4.1


    【解决方案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.");
            }
        }
    }
    

    【讨论】:

    • 所以主要是确保实体是有效的东西?
    • 任何类型的业务逻辑,真的。如果您有一个属性在设置不同类型的另一个属性时是必需的,而在其他情况下不需要,您可以通过在部分类中实现“幽灵方法”来做到这一点。
    • 我想我正在使用 AutoMapper 来制作 ViewModels 并且有显示名称。但是我想我需要在 ViewModel 和 Entity 上强制执行 required 等。
    • 非常感谢。只是想知道子对象本身的日期是否不能重叠。所以父实体有不同的子期间,我可以在哪里检查子期间本身不能跨越同一期间?
    • 有趣的是,我遇到了这个问题,并且正在开发一个库来定义具有子实体的实体,这些实体会进行完整性检查以避免日期范围冲突。放到github上我会告诉你的。
    【解决方案2】:

    当我不想让数据库有计算列时,我用它来增加我生成的类的计算值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多