【问题标题】:Using enum values in Domain Model with EF Code First approach使用 EF Code First 方法在域模型中使用枚举值
【发布时间】:2016-03-20 23:03:36
【问题描述】:

我在我的MVC 应用程序中使用Entity Framework Code First 方法,并且我为数据库中的每个表都有一些实体类。另一方面,我需要使用一些查找值,即性别、状态,我不想为其创建单独的域模型或表,因此我需要在相关的域模型类中定义 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
    }
}

【问题讨论】:

  • @Fabjan 对不起,你是对的 :) 我加了我的努力,你能帮忙吗?谢谢...
  • 如果我没记错的话,从 EF 5.0 开始就支持开箱即用的枚举,这意味着您可以在模型中使用您的枚举 - public ReasonOfVisit ReasonOfVisit { get; set; }
  • 究竟是什么不工作?你得到错误?只要数据库中的 num 字段被定义为 int 或 smallint,这应该是开箱即用的。
  • @L-Three 唯一的问题是枚举值在从控制器返回到视图后更改为其 id(我尝试以 JSON 格式返回)。除此之外,我想使用由多个单词组成的字符串值作为枚举值。有什么想法吗?

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


【解决方案1】:

如果您想在 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 会自动转换数值,你可以随意使用。

【讨论】:

  • 这个映射不是必须的,EF会自动做这个。
  • @L-Three 不知道 :)
  • @Kamo 感谢您的回复。实际上我使用的是 EF6,我认为没有必要使用 UserConfiguration 部分。无论如何,我想知道在这个例子中如何在枚举中使用字符串值,即“商务会议”?
  • @Christof 我相信您应该将ReasonOfVisit 作为一个枚举并在需要时对其进行解析。
  • 投票+。但唯一的问题是显示枚举的多个单词值。有什么想法吗?
【解决方案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

public class Visitor
{
    ...

    public byte ReasonOfVisitAsByte { get; set; }

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

    ...
}

附: 关于你的问题:

枚举值的数据类型是什么

EF 很可能使用int 类型

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

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

【讨论】:

  • 感谢您的回复。它似乎正在工作,但枚举值在从控制器传递到视图后转换为其 id 值。现在我有两个问题:1)枚举值的数据类型是什么?因为我们这里没有设置,会不会自动分配? 2)如何在这个枚举中定义字符串值,即“商务会议”?
  • 非常感谢您的回复。我尝试了一些方法来显示枚举的多个单词值,即Dealing with Enum in MVC 5.1,但仍然无法显示它们。显示属性还可以,但我不确定我错过了什么。任何想法?另一方面,因为这个答案对我很有帮助,所以我投票了+
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
相关资源
最近更新 更多