【问题标题】:Does EF7 (EFCore) support enums?EF7 (EFCore) 是否支持枚举?
【发布时间】:2019-05-02 03:43:20
【问题描述】:

我对 EF7 RC1 (EFCore) 有疑问。我无法在我的模型中使用枚举。我可以保存枚举属性。该值被强制转换为 int。我的问题是,在读取数据期间,我得到了无效的强制转换异常。

  1. EF7 是否支持枚举属性?
  2. 如何使用 fluent api 进行配置?

谢谢

编辑:

枚举:

  public enum LimitMode 
    {
        Max,
        Min,
        MaxAndMin,
    }

型号:

  public class SomeModel 
    {
    (..)
    public LimitMode LimitMode {get; set;}
    }

SomeModel 的模型构建器:

        modelBuilder.Entity<SomeModel>(entity => {
            (...)
            entity.Property(p => p.LimitMode);
        })

【问题讨论】:

  • 尝试明确地说枚举是一个 int public enum LimitMode : int 并给枚举的成员一个值 (Max = 0, ...)
  • 我试过这个。不幸的是,它不起作用。仍然收到无效的强制转换异常:/
  • 奇怪,在 EF6 中它可以完美运行。 EF7 尚未完全发布,因此它可能仍然是一个错误,或者您的数据库中有未连接到任何枚举的值。如果您的枚举值为 1-3,并且您的数据库中存储了 4,我想您会收到该错误。

标签: entity-framework entity-framework-core


【解决方案1】:

EntityFrameworkCore 2.1 现在支持值转换器 这允许您将 Enums 视为数据库中的字符串,并让它们正确转换为模型中的 Enums。

您可以使用值转换器执行此操作。您可以创建自己的,但 EF Core 2.1 附带了一些开箱即用的预定义值转换器。其中之一是 EnumToString 值转换器。

所以给出以下内容:

public class Rider
{
    public int Id { get; set; }
    public EquineBeast Mount { get; set; }
}

public enum EquineBeast
{
    Donkey,
    Mule,
    Horse,
    Unicorn
}

像这样使用默认转换器:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Rider>()
        .Property(e => e.Mount)
        .HasConversion<string>();
}

或者,如果您更喜欢在模型类上使用属性,如下所示:

public class Rider
{
    public int Id { get; set; }

    [Column(TypeName = "nvarchar(24)")]
    public EquineBeast Mount { get; set; }
}

【讨论】:

【解决方案2】:

这对我有用。我在 project.json 中使用“EntityFramework.MicrosoftSqlServer”:“7.0.0-rc1-final”。作为推送模型的一部分,我必须运行 ef migrations database update。

public class Person
{
    public int PersonId { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public int PersonTypeId { get; set; }
    public PersonType PersonType { get; set; }
    public ActiveType ActiveType { get; set; }
}

public enum ActiveType
{
    Active = 0,
    Inactive = 1
}

【讨论】:

  • 使用枚举迁移后架构是什么样的?我问是因为迁移现在对 MySQL 不起作用,所以我需要手动创建模式。
  • 它将被设置为 int 列
猜你喜欢
  • 2012-12-03
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 2015-05-12
  • 1970-01-01
  • 2017-04-02
  • 2023-02-07
相关资源
最近更新 更多