实体框架列名称到属性映射dbentry

时间:2016-01-04 13:07:16

标签: c# entity-framework entity-framework-core

我尝试将实体属性映射到数据库列名,同时在DbContext中保存实体,但我无法确定如何在EF7中执行此操作。

生成包含迁移的数据库模式后,列名称并不总是与object中的属性名称相同。 例如,在对象模式下面:

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

    public string Name { get; set; }

    public User Author { get; set; }
}

在数据库中有 Id Name AuthorId 列。 接下来,当我在EntityEntry属性上进行迭代时,它包含Id,Name和AthorId列。我可以轻松地映射Id和Name。
我正在寻找的是如何弄清楚" AuthorId"在EntityEntry中映射到Document?

中的Author字段



Backround :我正在实施通用对象版本历史记录机制,该机制将从EntityEntries获取修改后的列(来自 SaveChanges ()中的 ChangeTracker DbContext )并保存适当的列及其新值。接下来,在恢复对象时,它应该能够将这些更改映射到正确的实体字段。

我在EF6 Where does Entity Framework store the mapping between property names and the columns it selects in SQL?中找到了类似的问题,但它非常复杂并且使用了特定于EF6的类。

1 个答案:

答案 0 :(得分:0)

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

因此,您需要DbContextDbSet s:

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