【问题标题】:Why uint enums are ignored in Entity Framework为什么在实体框架中忽略 uint 枚举
【发布时间】:2017-03-03 11:51:43
【问题描述】:

好的,Entity Framework 6.1.3,.Net Framework 4.5,这里是示例代码。

假设,我有一个这样的实体类:

public enum IdiocyLevel : uint { ExtremlyDumb, MaybeNotDumb, SmartEnough }
public enum SpreadLevel : byte { NoBodyUseIt, CommonUse, DeFactoStandart }

public class FrameworkReview
{
    public int Id { get; set; }
    public String FrameworkName { get; set; }
    public IdiocyLevel Idiocy { get; set; }
    public SpreadLevel Spread { get; set; }

    public override string ToString() { return String.Format("{0}:{1} - {2}, {3}", Id, FrameworkName, Spread, Idiocy); }
}

非常简单。 ID 键、字符串和两个枚举值。第一个枚举支持为uint,第二个为byte

我有一个像这样的DbContext 类:

public class DatabaseContext : DbContext
{
    public DbSet<FrameworkReview> Frameworks { get; set; }

    public DatabaseContext()
        : base("Data Source=(localdb)\\v11.0; Integrated Security=True; " +
               "AttachDbFilename=" + AppDomain.CurrentDomain.BaseDirectory + "enum.mdf")
    {
    }
}

现在,如果我使用这些类,我的第一个枚举总是存储为默认值:

class Program
{
    static void Main(string[] args)
    {
        FrameworkReview originalReview = new FrameworkReview()
        {
            FrameworkName = "EntityFramework",
            Idiocy = IdiocyLevel.SmartEnough,
            Spread = SpreadLevel.DeFactoStandart
        };
        Console.WriteLine(originalReview);

        int storedReviewId = 0;

        using (DatabaseContext dbContext = new DatabaseContext())
        {
            FrameworkReview storedReview = dbContext.Frameworks.Add(originalReview);
            dbContext.SaveChanges();

            Console.WriteLine(storedReview);
            storedReviewId = storedReview.Id;
        }

        using (DatabaseContext dbContext = new DatabaseContext())
        {
            FrameworkReview readedReview = dbContext.Frameworks.Find(storedReviewId);
            Console.WriteLine(readedReview);
        }

        Console.ReadKey(true);
    }
}

输出将是

0:EntityFramework - DeFactoStandart, SmartEnough
1:EntityFramework - DeFactoStandart, SmartEnough
1:EntityFramework - DeFactoStandart, ExtremlyDumb

为什么? EF 不允许我存储 uint 值(这是 C# 枚举的默认值)?这在文档中的某处有说明吗?

【问题讨论】:

  • C#枚举的默认底层类型是int
  • 是的,默认底层类型是 int。我的错。

标签: c# .net entity-framework


【解决方案1】:

实体框架不支持无符号类型。

在此处了解更多信息: How to use unsigned int / long types with Entity Framework?

【讨论】:

  • 为什么回答问题而不将问题标记为链接帖子的重复?
  • 发布的问题及其答案与枚举无关。问题的原因很常见 - EF6 不支持无符号类型,答案是一样的。但是,问题不是同一件事,即它不是重复的。有人可能会偶然发现同样的问题并在谷歌上搜索“uint enum ef6 not working”,他会找到这个问题,但找不到链接的问题。当我决定不标记为骗子时,我只是觉得“不,这不是骗子”。当然,我可能错了:)
  • 明白了,很公平:)
  • 好的,我用谷歌搜索“ef unsigned types”,发现他们将其标记为“不会修复”:entityframework.codeplex.com/workitem/1489
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多