Supportiamo gli Enum in EF4.1 CodeFirst

Scritto da  Antonio Pierascenzi il martedì 17 maggio 2011  •  Linguaggio: C#   • Livello: 200


Sicuramente sarà capitato di doversi scontrare con questa "mancanza" in fase di configurazione del mapping del nostro modello di dominio con il modello dati fornitoci da EF4.
CodeFirst soffre ovviamente di questa problematica come annunciato dallo stesso team di sviluppo di EF.
Per sopperire a questa mancanza possiamo applicare un workaround basato sull'utilizzo di una classe che fa da wrapper al nostro enum e che potrà essere interpretata, ad esempio, dall'engine di CodeFirst come un Complex Type, dopo averla dichiarata tale in fase di configurazione del Context. (vedi precedenti post sul tema).

// enum type
public enum Sex
{
Male=1,
Female=2
}

// wrapper class for enum support in EF4
public class TypeSex
{
public int Value { get; private set; }
public TypeSex(int value)
{
Value = value;
}
public TypeSex(Sex sex)
{
Value = (int)sex;
}
//perform implicit conversion
public static implicit operator int(TypeSex typeSex)
{
return typeSex.Value;
}
public static implicit operator TypeSex (int value)
{
return new TypeSex(value);
}
public static implicit operator Sex(TypeSex typeSex )
{
return (Sex)typeSex.Value;
}
public static implicit operator TypeSex (Sex sex)
{
return new TypeSex (sex);
}
}

La classe come vediamo opera delle conversioni implicite sul tipo che dobbiamo persistere.Per maggiori info. http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx.
Di seguito un banalissimo esempio d'uso delle classe TypeSex che "sostituisce", come proprietà della classe Person, l'iniziale enum Gender.

// using on class person example
public class Person
{
public String Name { get; set; }
public String Surname { get; set; }
public DateTime? DateOfBirth { get; set; }
//use wrapper classe for EF4 support
public TypeSex Gender { get; set; }
}


Tags: EF4,CodeFirst

 
x