nombre de la columna del marco de la entidad a la propiedad mapeo dbentry

c# entity-framework entity-framework-core

Pregunta

Estoy tratando de asignar las propiedades de la entidad a los nombres de las columnas de la base de datos al guardar las entidades en DbContext, pero no puedo entender cómo hacerlo en EF7.

Después de generar el esquema de base de datos con migraciones, los nombres de columna no siempre son los mismos que los nombres de propiedades en el objeto. Por ejemplo, debajo del esquema de objeto:

public class Document
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    public User Author { get; set; }
}

tendría las columnas Id , Name y AuthorId en la base de datos. A continuación, cuando estoy iterando sobre las propiedades EntityEntry, contiene las columnas Id, Name y AthorId. Puedo mapear fácilmente la identificación y el nombre.
Lo que estoy buscando es cómo descubrir que "AuthorId" en EntityEntry se asigna al campo Autor en el documento?



Backround : Estoy implementando el mecanismo del historial de versiones de objetos universales, que obtendría columnas modificadas de EntityEntries (desde ChangeTracker en SaveChanges () en DbContext ) y guardaría las columnas adecuadas y sus nuevos valores. A continuación, cuando restaure objetos, debería poder asignar estos cambios a los campos de entidad adecuados.

He encontrado una pregunta similar para EF6 ¿Dónde almacena Entity Framework la asignación entre los nombres de propiedades y las columnas que selecciona en SQL? pero es bastante complicado y usa clases específicas para EF6.

Respuesta popular

Según mi comentario, el campo Author no es un objeto / estructura simple (IE: DateTime , Enum , etc.) ni un primitivo (IE: int , string , etc.). Como tal, es una Navigation Property y solo se almacena el ID del objeto. Esta ID le permite navegar a la fila en otra tabla que almacena los datos complejos del objeto Author .

Como tal, querría un DbContext y DbSet s como tal:

public class Document {
    public int Id { get; set; } // No need for [Key] ID is auto detected
    public string Name { get; set; }

    // Foreign Keys
    public int AuthorId { get; set; } // Can use "int?" if you want to allow it to be nullable
    public User Author { get; set; }
}

public class Author {
    public int Id { get; set; }
    public string Name { get; set; }
}

public class BookContext : DbContext {
    public DbSet<Author> Authors { get; set; }
    public DbSet<Document> Documents { get; set; }
}

Esto producirá tablas:

Document: Id (int), Name (nvarchar), AuthorId (int) with FK to Author table
Author:   Id (int), Name (nvarchar)

Al consultar el DB:

var books = BookContext.Documents // Access documents table
                 .Include(q => q.Author) // Ensure that the author's properties are loaded, not just the ID
                 .Where(q => q.Name.Contains("SomeText")) // Search for documents with a name matching this text


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué