Salve os Enums de Sinalizador no Banco de Dados SQL e no EF6. Isso é possível?

Em um aplicativo ASP.NET, tenho uma enumeração de sinalizador da seguinte maneira:

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

Posso salvar um valor contendo mais de um item em uma tabela do database SQL usando o Entity Framework 6?

Como isso seria salvo?

Obrigado Miguel

Para colocar as coisas realmente simples, as flags podem ser vistas como int sum (só para ser simples, mas na verdade funcionam com operações bit a bit).

Assim, para o seu caso (enum fornecido), se um registro tiver dois alvos (Aluno e Professor), o resultado final será 6.

A EF irá armazenar apenas isso. 6. Você já disse que a EF deve armazenar esta coluna como INT porque você disse que o enum deve ser entendido como um int aqui:

 enum Target : int { 

Não há necessidade de fazer nada (absolutamente nada!) Mais.

Para colocar isso de volta no Student e no Professor, existe um Enum.Parse que você pode chamar manualmente (somente quando necessário), mas o EF também preencherá a propriedade com este já convertido.

No seu código, você terá que se preocupar com o código. Então, por exemplo, você pode fazer:

 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! } 

É só isso. Estou usando isso com o EF6 e não há nenhuma configuração. Pelo menos com a abordagem CodeFirst.

Mas não se esqueça que isso funcionará apenas com versões mais recentes do .NET framework. Dê uma olhada no tópico de suporte Enum da documentação do EF.

Você pode salvar uma combinação de sinalizadores como um int:

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

A única diferença entre tipos de enumeração com e sem HasFlagAttribute é como eles são gravados ao usar .ToString() (e talvez como eles são analisados ​​ao usar Enum.Parse). A EF internamente retira as informações sobre o tipo enum e está usando somente o tipo de enumeração subjacente (responsável pela capacidade de anulação).