EF4隐藏/替换基础字段

时间:2011-09-27 09:57:46

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

我在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时可能会覆盖它们。

1 个答案:

答案 0 :(得分:2)

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

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

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