实体框架列名称到属性映射数据库条目
本文关键字:映射 数据库 属性 框架 实体 | 更新日期: 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、Name 和 AuthorId 列。接下来,当我迭代 EntityEntry 属性时,它包含 Id、Name 和 AthorId 列。我可以轻松映射 ID 和名称。
我正在寻找的是如何确定实体条目中的"作者 ID"映射到文档中的作者字段?
回合:我正在实现通用对象版本历史记录机制,该机制将从 EntityEntries 中获取修改后的列(来自 DbContext 中 SaveChanges(( 中的 ChangeTracker(,并保存适当的列和新值。接下来,在还原对象时,它应该能够将这些更改映射到正确的实体字段。
我在 EF6 中发现了类似的问题 实体框架在哪里存储属性名称与其在 SQL 中选择的列之间的映射? 但它非常复杂,并且使用特定于 EF6 的类。
根据我的评论,Author
字段不是简单的对象/结构(IE:DateTime
,Enum
等(,也不是基元(IE:int
,string
等(。因此,它是一个Navigation Property
,仅存储对象的 ID。然后,此 ID 允许您导航到另一个表中存储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