如何在实体框架4中映射枚举属性

本文关键字:映射 枚举 属性 框架 实体 | 更新日期: 2023-09-27 18:07:30

我的模型有一个枚举属性:

Sql server column "user_status" is a int NOT NULL.
[Column("User_Status")]
public UserStatus UserStatus { get; set; }
public enum UserStatus
{
    Pending  = 1,
    Member = 2,
    Banned   = 3
}

当前我得到一个错误,当我保存实体,因为它说列user_status不能为空。

如何让实体框架在保存/更新时将此属性转换为Int,并在加载实体时将其转换为enum

如何在实体框架4中映射枚举属性

Entity Framework 4不支持使用枚举作为列类型。如果你想拥有对枚举的原生支持,你需要升级到Entity Framework 5。

如果你必须使用EF 4(因为一个项目已经在它中实现了),那么我建议你这样做:

[Column("User_Status")]
public int UserStatusAsInt { get; set; }
[NotMapped]
public UserStatus UserStatus
{
  get { return (UserStatus) this.UserStatusAsInt; }
  set { this.UserStatusAsInt = (int)value; }
}

这不是一个漂亮的解决方案,但它是一个可靠的解决问题的方法,并且您仍然可以在页面上绑定它,并在其他代码中将其视为enum本身。

有时需要映射enumstring值而不是int值。你可以这样做:

public enum DwellingType { Apartment, Cottage, House }
public DwellingType DwellingType { get; set; } // This wont be mapped in EF4 as it's an enum
public virtual string DwellingTypeString       // This will be mapped
{
    get { return DwellingType.ToString(); }
    set
    {
        DwellingType stringValue;
        if(Enum.TryParse(value, out stringValue))
        { DwellingType = stringValue; }
    }
}

这实际上不是我的工作,我遇到了,而试图映射enums与EF4。不幸的是,我不记得我在哪里找到了它,但仍然可能对其他人有用。