在域模型中使用枚举值和EF代码优先方法

本文关键字:EF 代码 方法 枚举 模型 | 更新日期: 2023-09-27 18:26:53

我在MVC应用程序中使用Entity Framework Code First方法,并且数据库中的每个表都有一些实体类。另一方面,我需要使用一些查找值,即性别,我不想为其创建单独的域模型或表的状态,因此我需要在相关的域模型类或单独的类中定义enum值。虽然网上有很多样品,但我还没有找到适合EFMVC的。你能提供一个执行此要求的示例用法吗?

注意:我使用MVC5EF6。这是我的实体类Visitor和示例实体,可以在单独的类(.cs文件)或同一类(.c文件)中定义:

namespace MyProject.Entities
{
    public class Visitor
    {
        [Key]
        public int VisitorID { get; set; }
        public string VisitorName { get; set; }
        //[ForeignKey("ReasonOfVisit")]
        public byte ReasonOfVisit { get; set; }
        //code omitted for brevity
    }

    public enum ReasonOfVisit
    {
        NotSet = 0,
        Business meeting = 1,
        Periodic visit = 2,
        Getting information = 3,
        Leaving package = 4
    }
}

在域模型中使用枚举值和EF代码优先方法

如果您想在EF模型中使用枚举,您可以尝试以下解决方案:

    public class User
    {
        public string Id { get; set; }
        public RegistrationStatus RegistrationStatus { get; set; }
    }
    public class UserConfiguration : EntityTypeConfiguration<User>
    {
        public UserConfiguration()
        {
                this.Property(x => x.RegistrationStatus)
                .HasColumnType("int")
                .IsRequired();
        }
    }
    public enum RegistrationStatus
    {
        Pending = 1,
        Active = 2,
        Blocked = 3
    }

当然,它被尽可能简化了。您基本上要做的是将枚举映射到某个基元类型。EF将自动转换值,您可以随心所欲地使用它。

使用实体框架5.0以后的版本,您只需使用您的枚举:

namespace MyProject.Entities
{
    public enum ReasonOfVisit
    {
        NotSet = 0,
        For business reason = 1,
        For control = 2,
        For lefting package = 3,
        For leisure = 4
    }
    public class Visitor
    {
        ...
        public ReasonOfVisit ReasonOfVisit { get; set; }
        ...
    }
}

如果您正在使用EF<5.0您可以使用映射到byte/int属性的枚举类型属性

public class Visitor
{
    ...
    public byte ReasonOfVisitAsByte { get; set; }
    public ReasonOfVisit ReasonOfVisit { get { return (ReasonOfVisit)ReasonOfVisitAsByte; }  
                                         set { ReasonOfVisitAsByte = (byte)value; } } 
    ...
}

p.S。关于您的问题:

枚举值的数据类型是什么

EF最有可能使用int

如何在此枚举中定义字符串值

不能直接使用字符串,但如果使用属性并付出一些额外的努力,则可以直接设置枚举返回字符串,而不是其int值。你可以在这里阅读更多关于它的信息