Share via


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. In questo argomento vengono illustrati 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 automatiche 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, verranno configurati 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 durante la creazione di simulazioni o falsi, in cui è 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 allo stesso modo del contesto che usa la classe DbSet per le relative proprietà impostate.

DbContext con proprietà impostate di sola lettura

Se non si desidera esporre setter pubblici per le proprietà DbSet o IDbSet, è invece possibile creare proprietà di sola lettura e creare manualmente le istanze del set. 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à restituisca 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 getter e setter pubblici.