微软的EF6团队何时会添加完整的枚举支持?
示例代码段如下所示。 vs2013,EF6.0.1
自EF5以来,大概是EF支持enum。
然而有一个GOTCHA:http://msdn.microsoft.com/en-us/data/hh859576
并非所有基础类型都受支持
仅:字节,Int16,Int32,Int64或SByte。
是的,测试应该揭示问题,就像它对我所做的那样,但是,我几乎错过了它,因为我的SQL表有很多列。
在http://msdn.microsoft.com/en-us/data/ee712907,EF小组建议我们应该在SO处发布EF问题。
以下是代码:
namespace EF6enums
{
public enum Country : long { Canada = 1, England = 2 }
将“long”更改为“ulong”会破坏代码。
public class EF6Poco
{
public Int32 ID { get; set; }
public String City { get; set; }
public Country CountryEnum { get; set; }
}
我们正在使用Code First:
public class EnumTestContext : System.Data.Entity.DbContext
{
public System.Data.Entity.DbSet<EF6Poco> EF6Pocos { get; set; }
}
这是Main方法:
class Program
{
static void Main(string[] args)
{
using (var context = new EnumTestContext())
{
context.EF6Pocos.Add(new EF6Poco
{ City = "Wasaga Beach",
CountryEnum = Country.Canada });
context.SaveChanges();
}
Console.WriteLine("Done");
Console.ReadLine();
}
}
} // namespace EF6enums
答案 0 :(得分:4)
不支持ulong枚举是EDM一般不支持无符号数字类型的结果。无符号数字类型可能很有用,但我不确定ulong枚举是否有用。如果你想使用枚举类型作为位字段,那么符号无关紧要 - 在这种情况下,你只关心位和无符号,并且它的对应符号枚举类型具有相同的位数,因此你可以使用它们。 [Flags]
属性也很有趣 - 它唯一影响的是.ToString()
如何工作(也许.Parse()
,因为这是相反的操作)。就使用枚举类型而言,它没有做任何特殊的事情 - 即你可以对有和没有[Flags]
属性的枚举进行相同的操作(无论是按位操作还是非按位操作),你应该得到无论是否存在属性,都会得到相同的结果。
就静默忽略无符号数字类型的属性而言,我们长期讨论是否保持原样或抛出异常。我们决定将其保留为原样,因为将其更改为throw将是一个重大变化,并且意味着现在EF4.x或EF5中创建的模型在EF6中将被视为无效。此外,通常Code First倾向于忽略它不理解的类型的属性,因此当前行为与一般原则一致。这里真正的问题是,人们并不知道EF不理解无符号数字类型并且会出乎意料。我同意EF理解无符号数字类型的期望是合理的,不幸的是EF不支持它。