2017-03-03 88 views
2

好吧,Entity Framework 6.1.3,.Net Framework 4.5,这里是示例代码。为什么uint枚举在实体框架中被忽略

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

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#枚举的默认值)?这是在文档中说明的吗?

+1

默认的基本类型C#枚举的是'int'。 –

+0

Yap,默认的底层类型是int。我的错。 –

回答

4

实体框架不支持未签名类型。

了解更多关于在这里:​​ How to use unsigned int/long types with Entity Framework?

+0

为什么回答并没有将问题标记为链接文章的副本? –

+0

发布的问题及其答案不是关于枚举。问题的原因很常见 - EF6不支持无符号类型,答案也是一样的。但是,问题不是同一件事,即它不是重复的。有人可能会偶然发现同样的问题,谷歌为“uint枚举ef6不工作”,他会发现这个问题,但不会找到链接的问题。当我决定不把它当作笨蛋时,我只是感觉到“naah it does not dupe”。我可能是错的,当然:) –

+0

明白了,足够公平:) –