Devo ammetterlo, non ho resistito alla tentazione e ho subito installato sulla VM la versione CTP June 2011 di Entity Framework. La prima feature che ho provato è il supporto agli enumerativi in modalità Code First. Partiamo subito con l’esempio. Banale classe Product e relativo DbContext:
public class Product
{
public string Code { get; set; }
public string Description { get; set; }
public DiscountType Discount { get; set; }
}
public class Db : DbContext
{
public DbSet<Product> Products { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Product>().HasKey(p => p.Code);
}
}
La classe Product espone la proprietà Discount di tipo DiscountType (Enum) cosi definito:
public enum DiscountType
{
Less_Than_20_percent = 0,
Less_Than_40_Percent = 1,
Less_Than_60_Percent = 2
}
Aggiungiamo del codice per creare e popolare il database:
Database.SetInitializer<Db>(new DropCreateDatabaseAlways<Db>());
using (Db db = new Db())
{
int productsCount = db.Products.Count();
////Add new product.
Product p1 = new Product() { Code = "COD123", Description = "Shoes", Discount = DiscountType.Less_Than_20_percent };
db.Products.Add(p1);
Product p2 = new Product() { Code = "COD124", Description = "Jacket", Discount = DiscountType.Less_Than_40_Percent };
db.Products.Add(p2);
Product p3 = new Product() { Code = "COD125", Description = "Skirt", Discount = DiscountType.Less_Than_60_Percent };
db.Products.Add(p3);
db.SaveChanges();
}
using (Db db = new Db())
{
Product pr = db.Products.Where(p => p.Discount == DiscountType.Less_Than_60_Percent).FirstOrDefault();
MessageBox.Show(string.Format("{0}-{1}", pr.Code, pr.Description));
}
Diamo uno sguardo al database creato:
Con la tabella Products così popolata:
Notevole (Certo, se il supporto agli Enum, fosse arrivato qualche versione prima …)
Aggiornamento di servizio:
Piccola nota: finalmente sono riuscito a trovare qualche minuto per documentarmi. In questa versione il supporto agli Enum ha alcune limitazioni:
- I metodi ToString() e TryParse() non possono essere utilizzati nelle query
- Come sottolineava Raffaeu (vedi commenti) non è possibile mappare un Enum a stringhe e\o altri valori arbitrari
- Non è possibile utilizzare un Enum come campo discriminatorio nella gestione delle gerarchie classi\tabelle
Da quanto si legge queste limitazioni potrebbero essere superate con i prossimi rilasci. Vedremo.