имя столбца структуры объекта для сопоставления свойств dbentry

c# entity-framework entity-framework-core

Вопрос

Я пытаюсь сопоставить свойства объектов с именами столбцов базы данных, сохраняя объекты в DbContext, но я не могу понять, как это сделать в EF7.

После создания схемы базы данных с миграциями имена столбцов не всегда совпадают с именами свойств в объекте. Например, ниже схемы объектов:

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

    public string Name { get; set; }

    public User Author { get; set; }
}

будет иметь идентификатор, имя и AuthorID столбцы в базе данных. Затем, когда я повторяю свойства EntityEntry, он содержит столбцы Id, Name и AthorId. Я могу легко сопоставить Id и Name.
Вещь, которую я ищу, - это выяснить, что «AuthorId» в EntityEntry сопоставляется с полем «Автор» в документе?



Backround : Я реализую механизм истории универсальной объектной версии, который будет получать измененные столбцы из EntityEntries (из ChangeTracker в SaveChanges () в DbContext ) и сохранять правильные столбцы и новые значения. Затем при восстановлении объектов он должен иметь возможность сопоставлять эти изменения с соответствующими полями объектов.

Я нашел аналогичный вопрос для EF6. Где Entity Framework хранит сопоставление между именами свойств и столбцами, которые он выбирает в SQL? но он довольно сложный и использует классы, специфичные для EF6.

Популярные ответы

Согласно моему комментарию, поле Author не является простым объектом / структурой (IE: DateTime , Enum и т. Д.), А также примитивным (IE: int , string и т. Д.). Таким образом, это Navigation Property и сохраняется только идентификатор объекта. Затем этот идентификатор позволяет перейти к строке в другой таблице, в которой хранятся сложные данные объекта Author .

Таким образом, вы хотели бы, чтобы DbContext и DbSet такими:

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

Это приведет к созданию таблиц:

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

При запросе БД:

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


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему