Sto lavorando con Entity Framework 6 e ho un oggetto prodotto che ha un elenco di varianti come:
public class Product
{
public int ProductId { get; set;}
public virtual ICollection<Variant> Variants { get; set;}
... other properties
}
public class Variant
{
public int VariantId { get; set;}
public int ProductId { get; set;}
public virtual Product Product { get; set;}
public int StoreId { get; set;}
... other properties
}
E lo uso per ottenere i prodotti dal contesto:
public static GetProducts()
{
using (MyDBContext context = new MyDBContext())
{
return context.Products.Include(p => p.Variants);
}
}
Ora tutto funziona bene e quando ottengo il Product
ritorna con le varianti. Tuttavia, stamattina ho scioccamente usato il Product
dal contesto invece di un DTO e ho filtrato le varianti basate su un StoreId
e ora ogni volta che ottengo un Product
, restituisce solo le varianti per quel negozio (anche se non ho mai effettuato alcuna modifica).
Ho controllato il db e tutte le varianti sono ancora lì, quindi come faccio a ripristinare il mio contesto in modo da ottenere nuovamente tutte le varianti.
Ho provato il seguente:
ricaricare il prodotto usando:
foreach (Product product in context.Products) { context.Entry(product).Reload(); }
Ma niente sembra funzionare, c'è qualcos'altro che devo fare per resettare il contesto?
Come risulta, si trattava di un errore di configurazione con l'entità variante piuttosto che con il contesto filtrato. Stavo solo usando VariantID
come Key
ma siccome c'erano più varianti con lo stesso id, stava sovrascrivendo le seguenti varianti con gli stessi valori del primo con quell'id quando stava mappando gli oggetti dopo la query (rendendola sembra che ci fosse solo il negozio che avevo filtrato).
Ho risolto questo problema rendendo la chiave univoca per il negozio e la variante id:
HasKey(v => new {v.VariantId, c.StoreId});