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

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

将在数据库中具有IdNameAuthorId列。接下来当我迭代EntityEntry属性时,它包含Id,Name和AthorId列。我可以轻松地映射Id和Name。
我正在寻找的是如何弄清楚EntityEntry中的“AuthorId”是否映射到Document中的Author字段?



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

我在EF6中发现了类似的问题Entity Framework在哪里存储属性名称与它在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


Related

许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因