Definizione di DbSet

Quando si sviluppa con il flusso di lavoro Code First, si definisce un dbContext derivato che rappresenta la sessione con il database ed espone un oggetto DbSet per ogni tipo nel modello. Questo argomento illustra i vari modi in cui è possibile definire le proprietà DbSet.

DbContext con proprietà DbSet

Il caso comune illustrato negli esempi code First consiste nell'avere un DbContext con proprietà DbSet pubbliche per i tipi di entità del modello. Ad esempio:

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

Se usato in modalità Code First, verrà configurato blog e post come tipi di entità, oltre a configurare altri tipi raggiungibili da questi tipi. Inoltre DbContext chiamerà automaticamente il setter per ognuna di queste proprietà per impostare un'istanza del dbSet appropriato.

DbContext con proprietà IDbSet

Esistono situazioni, ad esempio quando si creano fittizi o falsi, dove è più utile dichiarare le proprietà del set usando un'interfaccia. In questi casi l'interfaccia IDbSet può essere usata al posto di DbSet. Ad esempio:

public class BloggingContext : DbContext
{
    public IDbSet<Blog> Blogs { get; set; }
    public IDbSet<Post> Posts { get; set; }
}

Questo contesto funziona esattamente come il contesto che usa la classe DbSet per le proprietà set.

DbContext con proprietà set di sola lettura

Se non si desidera esporre setter pubblici per le proprietà DbSet o IDbSet, è possibile creare invece proprietà di sola lettura e creare le istanze impostate autonomamente. Ad esempio:

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs
    {
        get { return Set<Blog>(); }
    }

    public DbSet<Post> Posts
    {
        get { return Set<Post>(); }
    }
}

Si noti che DbContext memorizza nella cache l'istanza di DbSet restituita dal metodo Set in modo che ognuna di queste proprietà restituirà la stessa istanza ogni volta che viene chiamata.

L'individuazione dei tipi di entità per Code First funziona nello stesso modo in cui funziona per le proprietà con getters e setters pubblici.