EF7(EFCore)是否支持枚举?

9

我有一个关于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, ...) - Alexander Derck
我已经尝试过了。不幸的是它没有起作用。仍然收到无效转换异常 :/ - panJapa
奇怪的是,在EF6中它完美地运行。EF7尚未完全发布,因此可能仍然存在错误,或者您的数据库中存在与任何枚举值都没有连接的值。如果您的枚举值为1-3,并且在您的数据库中存储了4,那么我想您会收到该错误。 - Alexander Derck
https://github.com/aspnet/EntityFramework/issues/3620 - user47589
2个回答

6

实体框架核心2.1现在支持值转换器(Value converters),这使得您可以在数据库中将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; }
}

不要在不同的问题下发布相同的答案。如果您认为问题相同,请将其标记为重复。1. https://dev59.com/olYN5IYBdhLWcg3wQWMV#49913196 2. https://dev59.com/pVcP5IYBdhLWcg3whaUD#49913219 3. https://dev59.com/OZPfa4cB1Zd3GeqPJeiK#49913063 - 4b0
1
好的,抱歉。我已将另外两个标记为此问题的重复,因为这是最早的一个。 - schnitty

1
这对我很有帮助。 我在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 中无法正常工作,所以我需要手动创建模式。 - Douglas Gaskell
它将被设置为整数列。 - Sergey Barskiy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接