Fluent Entity<T>.HasKey(t=>t.PropertyName
EF 框架要求每个实体都有一个键。这个键用于上下文以保持每个独立对象的跟踪。键是唯一的
而且经常由数据库生成。 Code First 默认规则作出了同样的预设。
回忆一下由 Destination 和 Lodging 类生成的数据库, DestinationId 和 LodgingId
的整型字段都被标记为主键和非空字段。如果进一步观察二者的列属性,你会发现这些字段是
自增长的标识字段,如图 3-1 所示,这是默认规则将整型量作为主键来管理。
大多数情况下,数据库中的主键不是 int 就是 GUID 类型,尽管任意类型都可以作为键属性。
数据库中的主键会是多个表的组成字段,类似地,一个实体的键也是某个类中的多个属性之一。
在本节结束的时候,你会看到如何配置复合键。
Code First 默认规则对不合规键属性的响应
如果在我们的类中我们意指的键碰巧满足 Code First 默认规则,那么一切顺利。但是如果不
满足规则呢?
我们向模型添加一个新类, Trip,见代码 3-1.Trip 类没有任何满足实体键默认规则的属性,
但我们的意图是 Identifier 属性应该作为键。
Example 3-1. The Trip class without an obvious key property
public class Trip
{
public Guid Identifier { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public decimal CostUSD { get; set; }
}
伴随这个新类,我们需要在 BrakAwayContext 中添加一个 DbSet<Trip>数据集:
public DbSet<Trip> Trips { get; set; }
我们再次运行程序,在尝试从类中创建模型时 DbModel Builder 抛出一个异常:
在模型生成过程中检测到一个或多个验证错误:
System.Data.Edm.EdmEntityType: :
实体类型 还没有定义 key。请为这个实体类型定义 Key.