【发布时间】:2015-04-12 04:50:43
【问题描述】:
我有两个类,如下所示:
public class Customer {
public string Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class CustomerChange : Customer {
public DateTime ChangedAtUtc { get; set; }
}
我正在尝试使用实体框架代码优先将这些映射到数据库模式。架构应如下所示:
+-------------+
| Customer |
+-------------|
| * Id |
| FirstName |
| LastName |
+-------------+
|
|
/|\
+----------------+
| CustomerChange |
+----------------+
| * Id |
| * ChangedAtUtc |
| FirstName |
| LastName |
+----------------+
所以Customer 表向您显示每个客户的 LATEST 状态,每次客户更改时,我们将 UPDATE Customer 表和 INSERT 一行插入 CustomerChange 表。 CustomerChange 为您提供该客户记录在一段时间内的完整历史记录 - 请注意,在此模型中应将 CustomerChanges 视为不可变的。
我尝试在 Customer.Id 和 CustomerChange.ChangedAtUtc 属性上都添加一个 [Key] 属性,但这不起作用。我已经尝试显式覆盖 OnModelCreating:
modelBuilder.Entity<CustomerChange>().Map(m => {
m.MapInheritedProperties();
m.ToTable("CustomerChanges");
}).HasKey(change => new { change.Id, change.ChangedAtUtc });
但我无法让 EF 使用复合键 (Id, ChangedAtUtc) 创建 CustomerChanges 表
(是的,在这个例子中,我依赖 id+timestamp 是唯一的。这很好。)
我应该如何装饰/覆盖各种实体框架位以正确创建此表?
【问题讨论】:
标签: c# entity-framework orm ef-code-first composite-key