【问题标题】:EF4 Hiding / Substitution of underlying fieldsEF4 隐藏/替换基础字段
【发布时间】:2011-09-27 09:57:46
【问题描述】:

我在 SQL Server 中有这样的数据模型:

table Note
- varchar NoteText
- tinyint PriorityLevel

在我的代码中,Entity Framework 把它变成了一个类:

class Note
- string NoteText
- byte PriorityLevel

在代码中我还有一个 PriorityLevel 枚举,这使我的代码更具可读性:

public enum PriorityEnum : byte
{
    NORMAL = 10,
    IMPORTANT = 20,
    URGENT = 30
}

所以,我想直接将该枚举与我的 Note 对象一起使用,例如 myNote.PriorityLevel = PriorityEnum.NORMAL,而不是像 myNote.PriorityLevel = (byte)PriorityEnum.NORMAL 那样一直强制转换。

我已经有了通过使用Partial 类声明的解决方案,但我最终得到了两个名称相似的属性,它们映射到底层的 PriorityLevel,这很混乱:

class Note
- string NoteText
- byte PriorityLevel
- PriorityEnum PriorityLevelEnum (gets/sets PriorityLevel)

当然,我希望我的 EF 类可以简单地定义为:

class Note
- string NoteText
- PriorityEnum PriorityLevel

仅供参考,我正在使用 POCO 生成我的 EF 实体类,因此我认为解决方案可能涉及更改生成它们的 T4 模板,但我担心我错过了一些简单的东西。我认为通过更改 EDMX 设计器中的字段定义可能会有解决方案,但我担心下次我从数据库定义更新 EDMX 时它们可能会被覆盖。

【问题讨论】:

    标签: .net entity-framework entity-framework-4 t4


    【解决方案1】:

    使用当前版本的实体框架,您将始终需要这两个属性,因为 EF 无法自动转换枚举并在映射中使用它们(这将在 future version 中更改)。

    因此,您在 EDMX 中定义的实体必须具有字节属性,并且您的部分类必须使用枚举公开第二个属性,并在 getter 和 setter 内部转换为字节。您可以做的是 reduce accessibility 您以前的映射属性。这种情况的缺点是 Linq-to-entities 查询不能使用您的枚举属性 - 它们必须使用原始字节属性,并且定义查询的代码必须有权访问该属性。

    修改模板为您创建枚举属性不会那么容易,因为模板需要一些信息来区分标准字节属性和类似枚举的属性。您可以使用一些命名约定来推断枚举,但如果您真的喜欢通用解决方案,则必须手动修改 EDMX 并使用 structural annotations 告诉 T4 模板应该为相关属性使用哪种枚举类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2015-05-25
      • 2012-02-13
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 2022-01-06
      相关资源
      最近更新 更多