Il metodo Find di Entity Framework 4.3 consente di recuperare un entità dal contesto in base alla chiave primaria.
Se l’entità è già presente nel contesto viene immediatamente restituita senza nessun round-trip al server in caso contrario viene effettuata una query di SELECT sul database.
L’oggetto recuperato viene collegato al contesto. Se l’oggetto non è presente nel contesto o nel database il metodo Find restituisce null.
Ad esempio:
_dbContext.Products.Find(1);
restituisce il prodotto con chiave 1 (int)
Supponiamo adesso di avere un prodotto con chiave primaria composta (composite key):
public class Product { public string StyleCode { get; set; } public string MaterialCode { get; set; } public string ColorCode { get; set; } }
Il mapping sarà di questo tipo:
public ProductMap() { HasKey(product => new { product.StyleCode, product.MaterialCode, product.ColorCode }); }
Inseriamo nel db un prodotto in questo modo:
_dbContext.Products.AddOrUpdate(p => new { p.MaterialCode, p.StyleCode, p.ColorCode }, new Product { StyleCode = "1", MaterialCode = "2", ColorCode = "3" });
ed invochiamo il metodo Find in questo modo:
_dbContext.Products.Find(1, 2, 3);
Molto probabilmente il risultato sarà null.
Questo perchè la firma del metodo Find è Find(params object[] keyValues) e quindi Entity Framework a questo punto non è ancora in grado di mappare i valori della chiave nell’ordine corretto.
Il mapping della classe Product va quindi modificato utilizzando il metodo HasColumnOrder:
public ProductMap() { HasKey(product => new { product.StyleCode, product.MaterialCode, product.ColorCode }); Property(p => p.StyleCode).HasColumnOrder(0); Property(p => p.MaterialCode).HasColumnOrder(1); Property(p => p.ColorCode).HasColumnOrder(2); }
In questo modo i parametri della chiave primaria vengono mappati in ordine.