我尝试将实体属性映射到数据库列名,同时在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?
Backround :我正在实施通用对象版本历史记录机制,该机制将从EntityEntries获取修改后的列(来自 SaveChanges ()中的 ChangeTracker DbContext )并保存适当的列及其新值。接下来,在恢复对象时,它应该能够将这些更改映射到正确的实体字段。
我在EF6 Where does Entity Framework store the mapping between property names and the columns it selects in SQL?中找到了类似的问题,但它非常复杂并且使用了特定于EF6的类。
答案 0 :(得分:0)
根据我的评论,Author
字段不是简单的对象/结构(IE:DateTime
,Enum
等),也不是原语(IE:int
,string
等)。因此,它是Navigation Property
并且仅存储对象的ID。然后,此ID允许您导航到另一个存储Author
对象的复杂数据的表中的行。
因此,您需要DbContext
和DbSet
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