实体框架列名称到属性映射数据库条目

本文关键字:映射 数据库 属性 框架 实体 | 更新日期: 2023-09-27 18:28:50

我正在尝试将实体属性映射到数据库列名称,同时将实体保存在 DbContext 中,但我无法弄清楚如何在 EF7 中做到这一点。

使用迁移生成数据库架构后,列名并不总是与对象中的属性名相同。例如,在以下对象架构:

public class Document
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public User Author { get; set; }
}

将在数据库中具有 Id、NameAuthorId 列。接下来,当我迭代 EntityEntry 属性时,它包含 Id、Name 和 AthorId 列。我可以轻松映射 ID 和名称。
我正在寻找的是如何确定实体条目中的"作者 ID"映射到文档中的作者字段?



回合:我正在实现通用对象版本历史记录机制,该机制将从 EntityEntries 中获取修改后的列(来自 DbContextSaveChanges(( 中的 ChangeTracker(,并保存适当的列和新值。接下来,在还原对象时,它应该能够将这些更改映射到正确的实体字段。

我在 EF6 中发现了类似的问题 实体框架在哪里存储属性名称与其在 SQL 中选择的列之间的映射? 但它非常复杂,并且使用特定于 EF6 的类。

实体框架列名称到属性映射数据库条目

根据我的评论,Author字段不是简单的对象/结构(IE:DateTimeEnum等(,也不是基元(IE:intstring等(。因此,它是一个Navigation Property,仅存储对象的 ID。然后,此 ID 允许您导航到另一个表中存储Author对象复杂数据的行。

因此,您需要一个DbContextDbSet如下:

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