Usare il metodo Find di Entity Framework con le chiavi composte

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.

Share

Come visualizzare i messagi di errore del framework in inglese

Dopo aver installato e configurato una nuova macchina per lo sviluppo con Windows 7 Ultimate (rigorosamente tutto in inglese), mi metto a far modifiche su un sito e ricevo le eccezioni in italiano.

Il problema è legato ai language pack di Windows 7 che probabilmente nel mio caso sono stati aggiunti in automatico durante un’installazione di SQL Server multilanguage.

Per visualizzare correttamente tutti i messaggi del Framework .Net in inglese è sufficiente andare nel pannello di controllo ->  (oppure usare il comando LPKSETUP)

Pannello di controllo - Lingue

e rimuovere tutte le lingue inutilizzate (io ho lasciato solo l’inglese).

Pannello di controllo - Rimozione lingue

Share