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



在 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 在内部剥离有关枚举类型的信息,并且仅使用基础枚举类型(考虑可空性)。

最新更新