Propriedades de sombraShadow Properties

Propriedades de sombra são propriedades que não estão definidas na sua classe de entidade do .NET, mas são definidas para esse tipo de entidade no modelo do 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. O valor e o estado dessas propriedades é mantida puramente no Rastreador de alteração.The value and state of these properties is maintained purely in the Change Tracker.

Propriedades de sombra são úteis quando há dados no banco de dados que não deve ser exposto nos tipos de entidade mapeada.Shadow properties are useful when there is data in the database that should not be exposed on the mapped entity types. Eles geralmente são usados para propriedades de chave estrangeira, onde a relação entre duas entidades é representada por um valor de chave estrangeiro no banco de dados, mas a relação é gerenciada nos tipos de entidade usando as propriedades de navegação entre os tipos de entidade.They 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.

Os valores de propriedade de sombra podem ser obtidos e alterados por meio de ChangeTracker API.Shadow property values can be obtained and changed through the ChangeTracker API.

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

Propriedades de sombra podem ser referenciadas em consultas LINQ por meio de EF.Property método estático.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"));

ConvençõesConventions

Propriedades de sombra podem ser criadas por convenção, quando uma relação é descoberta, mas nenhuma propriedade de chave estrangeira for encontrada na classe de entidade dependente.Shadow properties can be created by convention when a relationship is discovered but no foreign key property is found in the dependent entity class. Nesse caso, uma propriedade de chave estrangeira de sombra será introduzida.In this case, a shadow foreign key property will be introduced. A propriedade de chave estrangeira de sombra será denominada <navigation property name><principal key property name> (a navegação na entidade dependente, que aponta para a entidade principal, é usada para a nomeação).The shadow foreign key 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 o nome da propriedade de chave de entidade de segurança inclui o nome da propriedade de navegação, o nome será apenas <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 não houver nenhuma propriedade de navegação na entidade dependente, o nome do tipo de entidade de segurança é usado em seu lugar.If there is no navigation property on the dependent entity, then the principal type name is used in its place.

Por exemplo, a listagem de código a seguir resultará em uma BlogId que está sendo introduzida para a propriedade shadow o Post entidade.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; }

    public Blog Blog { get; set; }
}

Anotações de dadosData Annotations

Propriedades de sombra não podem ser criadas com anotações de dados.Shadow properties can not be created with data annotations.

API fluenteFluent API

Você pode usar a API Fluent para configurar as propriedades de sombra.You can use the Fluent API to configure shadow properties. Depois de ter chamado a sobrecarga de cadeia de caracteres de Property é possível encadear qualquer uma das chamadas de configuração que você faria para outras propriedades.Once you have called the string overload of Property you can chain any of the configuration calls you would for other properties.

Se o nome fornecido para o Property método corresponde ao nome de uma propriedade existente (uma propriedade de sombra ou um definido na classe de entidade) e, em seguida, o código irá configurar essa propriedade existente em vez de introduzir uma nova propriedade de sombra.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.

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; }
}