在 ASP.NET 应用程序上,我有一个标志枚举,如下所示:
[Flags]
enum Target : int {
None = 0,
Group = 1,
Student = 2,
Professor = 4,
All = Group | Student | Professor
}
是否可以使用实体框架 6 在 SQL 数据库表中保存包含多个项的值?
如何保存呢?
谢谢 米格尔
简单来说,标志可以看作是一个整数和(只是为了简单,但实际上它们与按位运算一起工作)。
因此,对于您的案例(提供的枚举),如果记录有两个目标(学生和教授),则最终结果将为 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 一起使用,根本没有配置。 至少使用代码优先方法。
但不要忘记,这仅适用于较新版本的 .NET 框架。查看 EF 文档中的枚举支持主题。
您可以将标志组合另存为 int:
int myFlags = (int)(Target.Group | Target.Professor);
带和不带HasFlagAttribute
的枚举类型之间的唯一区别是它们在使用.ToString()
时是如何编写的(也许在使用 Enum.Parse 时如何解析它们)。EF 在内部剥离有关枚举类型的信息,并且仅使用基础枚举类型(考虑可空性)。