使用EF Code First方法

时间:2015-12-15 08:40:11

标签: c# asp.net-mvc entity-framework enums domain-model

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

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

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
    }
}

2 个答案:

答案 0 :(得分:3)

如果您想在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会自动转换值,您可以根据需要使用它。

答案 1 :(得分:2)

使用实体框架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&lt; 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类型

  

如何在此枚举

中定义字符串值

您不能直接使用字符串,但如果您使用属性并做出一些额外的努力,则可以设置enum直接返回字符串而不是其int值。您可以阅读更多相关信息here