2017-03-03 60 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

明白了,足夠公平:) –