Capita spesso di avere nel database una tabella con gli utenti all'interno della quale c'è una colonna (foto) VarBinary che contiene l'avatar o la foto dell'utente. Quando mappiamo questa tabella con Entity Framework, la colonna viene mappata verso una proprietà di tipo byte[] che rappresenta la foto. Ogni volta che eseguiamo una query, la foto viene recuperata e messo nella proprietà mappata. Questo comportamento non è ottimale perchè nella maggior parte dei casi non abbiamo bisogno di recuperare la foto ad ogni query e quindi sprechiamo risorse.
Entity Framework non supprta il lazy loading di una proprietà che non sia una proprietà di navigazione, quindi per fare in modo che la foto venga caricata solo se richiesta, dobbiamo trasformare la foto in una proprietà di navigazione utilizando la tecnica del Table-Splitting che prevede che una tabella sia mappata su più classi. Cominciamo col definire le classi.
public class UserPhoto { public int Id { get; set; } public byte[] Contract { get; set; } public User User { get; set; } } public class User { public int Id { get; set; } public string Name { get; set; } public UserPhoto Photo { get; set; } }
Una volta che abbiamo definito le classi, dobbiamo mapparle sul database verso una sola tabella. possiamo raggiungere questo scopo grazie alle API di Code-First nel seguente modo.
public class SVCContext : DbContext { public DbSet<User> Users { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<User>().ToTable("Companies"); modelBuilder.Entity<UserPhoto>().ToTable("Companies"); modelBuilder.Entity<User>() .HasRequired(p => p.UserPhoto) .WithRequiredPrincipal(p => p.User); } }
Grazie al metodo ToTable, le classi sono mappate su una sola tabella mentre con i metodi HasRequired e WithRequiredPrincipal viene stabilita la relazione.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Simulare Azure Cosmos DB in locale con Docker
Utilizzare la funzione EF.Parameter per forzare la parametrizzazione di una costante con Entity Framework
Creare una libreria CSS universale - Rotazione degli elementi
Anonimizzare i dati sensibili nei log di Azure Front Door
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Utilizzare QuickGrid di Blazor con Entity Framework
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
Ottimizzare le pull con Artifact Cache di Azure Container Registry
Generare velocemente pagine CRUD in Blazor con QuickGrid
Documentare i servizi REST con Swagger e OpenAPI con .NET 9
Bloccare l'esecuzione di un pod in mancanza di un'artifact attestation di GitHub