在SQL数据库和EF6中保存标志枚举。 这可能吗?

在ASP.NET应用程序上,我有一个标志枚举如下:

[Flags] enum Target : int { None = 0, Group = 1, Student = 2, Professor = 4, All = Group | Student | Professor } 

我可以使用Entity Framework 6在SQL数据库表中保存包含多个项目的值吗?

怎么会得救?

谢谢你,米格尔

为了使事情变得非常简单,可以将标志视为一个int sum(只是为了简单但实际上它们与按位运算一起工作)。

因此,对于您的情况(提供枚举),如果记录有两个目标(学生和教授),最终结果将是6。

EF将存储这个。 6.您已经告诉EF应该将此列存储为INT,因为您已经说过枚举应该被理解为int:

 enum Target : int { 

没有必要做任何事情(绝对没有!)。

为了让这个回到学生和教授,有一个Enum.Parse,您可以手动调用(仅在需要时),但EF也将填充已经转换的属性。

在您的代码中,您将不得不担心代码。 所以,例如,你可以这样做:

 var item = new Something() { Prop = Target.Student | Target.Professor }; context.Save(); var item2 = context.GetSomething(); if (item2.Prop.HasFlag(Target.Professor) && item2.Prop.HasFlag(Target.Student)) { // WOW! } 

就是这样。 我在EF6上使用它,根本没有配置。 至少采用CodeFirst方法。

但不要忘记,这只适用于较新版本的.NET框架。 请参阅EF文档中的Enum支持主题。

您可以将标志组合保存为int:

 int myFlags = (int)(Target.Group | Target.Professor); 

使用和不使用HasFlagAttribute枚举类型之间的唯一区别是它们在使用.ToString()时的编写方式(以及使用Enum.Parse时它们的解析方式)。 EF内部删除有关枚举类型的信息,并且仅使用基础枚举类型(考虑可为空性)。