2017-03-03 1 views
2

Ok, Entity Framework 6.1.3, .Net Framework 4.5, und hier ist Beispielcode.Warum Uint Enums in Entity Framework ignoriert werden

Angenommen, ich habe eine Entity-Klasse wie folgt aus:

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); } 
} 

Sehr einfach. Id Schlüssel, String und zwei Enum-Werte. Die erste Enumeration wird als uint, die zweite als byte gesichert.

Ich habe eine DbContext Klasse wie folgt:

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") 
    { 
    } 
} 

Nun, wenn ich diese Klassen verwenden, meine erste Aufzählungs immer als Standardwert gespeichert ist:

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); 
    } 
} 

wird der Ausgang sein

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

Warum? EF erlaubt mir nicht, Uint-Werte zu speichern (was ist Standard für C# enums)? Ist das irgendwo in der Dokumentation angegeben?

+1

Der Standard zugrunde liegende Typ von C# Aufzählungen ist 'int'. –

+0

Yap, Standard zugrunde liegenden Typ es ist Int. Mein Fehler. –

Antwort

4

Vorzeichenlose Typen werden von Entity Framework nicht unterstützt.

Lesen Sie mehr darüber hier: How to use unsigned int/long types with Entity Framework?

+0

Warum beantworten und nicht die Frage als Duplikat des verlinkten Beitrags markieren? –

+0

Die gepostete Frage und ihre Antworten beziehen sich nicht auf Enums. Der Grund für das Problem ist häufig - EF6 unterstützt keine vorzeichenbehafteten Typen, und die Antwort ist die gleiche. Die Frage betrifft jedoch nicht dasselbe, d. H. Es ist kein Duplikat. Jemand kann auf das gleiche Problem stolpern und googlen, weil "uint enum ef6 nicht funktioniert", und er wird diese Frage finden, wird aber die verknüpfte nicht finden. Ich habe gerade etwas wie "naah, es ist kein Betrogener" gefühlt, als ich mich entschieden habe, mich nicht als düplich zu bezeichnen. Ich kann natürlich falsch liegen :) –

+0

Bekam, fair genug :) –

Verwandte Themen