Proprietà shadowShadow Properties

Le proprietà shadow sono proprietà che non sono definite nella classe di entità .NET, ma sono definite per il tipo di entità nel modello di EF Core.Shadow properties are properties that are not defined in your .NET entity class but are defined for that entity type in the EF Core model. Il valore e lo stato di queste proprietà vengono mantenuti esclusivamente nello strumento di rilevamento delle modifiche.The value and state of these properties is maintained purely in the Change Tracker. Le proprietà shadow sono utili quando nel database sono presenti dati che non devono essere esposti sui tipi di entità mappati.Shadow properties are useful when there is data in the database that should not be exposed on the mapped entity types.

Proprietà Shadow chiave esternaForeign key shadow properties

Le proprietà shadow vengono spesso utilizzate per le proprietà di chiave esterna, in cui la relazione tra due entità è rappresentata da un valore di chiave esterna nel database, ma la relazione viene gestita sui tipi di entità utilizzando le proprietà di navigazione tra l'entità tipi.Shadow properties are most often used for foreign key properties, where the relationship between two entities is represented by a foreign key value in the database, but the relationship is managed on the entity types using navigation properties between the entity types. Per convenzione, EF introdurrà una proprietà shadow quando viene individuata una relazione, ma non viene trovata alcuna proprietà di chiave esterna nella classe di entità dipendente.By convention, EF will introduce a shadow property when a relationship is discovered but no foreign key property is found in the dependent entity class.

La proprietà verrà denominata <navigation property name><principal key property name> (la navigazione sull'entità dipendente, che fa riferimento all'entità principale, viene utilizzata per la denominazione).The property will be named <navigation property name><principal key property name> (the navigation on the dependent entity, which points to the principal entity, is used for the naming). Se il nome della proprietà chiave principale include il nome della proprietà di navigazione, il nome sarà appena <principal key property name>.If the principal key property name includes the name of the navigation property, then the name will just be <principal key property name>. Se non è presente alcuna proprietà di navigazione nell'entità dipendente, il nome del tipo di entità viene usato al suo posto.If there is no navigation property on the dependent entity, then the principal type name is used in its place.

Il seguente listato di codice, ad esempio, comporterà l'introduzione di una proprietà shadow BlogId all'entità Post:For example, the following code listing will result in a BlogId shadow property being introduced to the Post entity:

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

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    // Since there is no CLR property which holds the foreign
    // key for this relationship, a shadow property is created.
    public Blog Blog { get; set; }
}

Configurazione delle proprietà shadowConfiguring shadow properties

Per configurare le proprietà shadow, è possibile usare l'API Fluent.You can use the Fluent API to configure shadow properties. Una volta chiamato l'overload di stringa di Property, è possibile concatenare qualsiasi chiamata di configurazione per altre proprietà.Once you have called the string overload of Property, you can chain any of the configuration calls you would for other properties. Nell'esempio seguente, poiché Blog non dispone di una proprietà CLR denominata LastUpdated, viene creata una proprietà shadow:In the following sample, since Blog has no CLR property named LastUpdated, a shadow property is created:

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property<DateTime>("LastUpdated");
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

Se il nome fornito al metodo Property corrisponde al nome di una proprietà esistente (una proprietà shadow o un oggetto definito nella classe di entità), il codice configurerà la proprietà esistente anziché introdurre una nuova proprietà shadow.If the name supplied to the Property method matches the name of an existing property (a shadow property or one defined on the entity class), then the code will configure that existing property rather than introducing a new shadow property.

Accesso alle proprietà shadowAccessing shadow properties

I valori delle proprietà shadow possono essere ottenuti e modificati tramite l'API ChangeTracker:Shadow property values can be obtained and changed through the ChangeTracker API:

context.Entry(myBlog).Property("LastUpdated").CurrentValue = DateTime.Now;

È possibile fare riferimento alle proprietà shadow nelle query LINQ tramite il metodo statico EF.Property:Shadow properties can be referenced in LINQ queries via the EF.Property static method:

var blogs = context.Blogs
    .OrderBy(b => EF.Property<DateTime>(b, "LastUpdated"));