人们倾向于在他们的实体类中使用属性来设计数据库中表和列的名称。然而,这限制了实体类的可重用性。
假设您希望您的OrderItem
类在两个不同的数据库中:在数据库 A 中,每个OrderItem
都有一个指向Order
它所属的外键 named OrderId
,在数据库 B 中,您想要一个外键 named order_id
。
然而,你是一个优秀的程序员,你的类很受欢迎,你不想通过限制类的使用来让你的类的用户失望。因此,您使用fluent API来设计数据库而不是属性。
Fluent API 用于覆盖DbContext.OnModelCreating
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// in databases for this context, every OrderItem belongs to exactly one Order
// using foreign key "order_id"
// model the table with the OrderItems:
var orderItemTableBuilder = modelBuilder.Entity<OrderItem>();
// (1) if needed: give it a non-default table name
// (2) if needed: tell which property is the primary key
// (3) design the one-to-many:
// (3a) between which tables?
// (3b) which property holds the foreign key?
orderItemTableBuilder
.ToTable("MyTableName") // (1)
.HasKey(orderItem => orderItem.ItemNo // (2)
// (3) design one to many
.HasRequired(orderItem => orderItem.Order) // (3a)
.WithMany(order => order.OrderItems) // (3a)
.HasForeignKey(orderItem => orderItem.orderId); // (3b)
// model property orderId: it must be stored in column "order_id"
orderItemTableBuilder.Property(orderItem => orderItem.orderId)
.HasColumnName("order_id");
}
因为您遵循实体框架编码约定来设计一对多,所以您不必在模型构建器中对其进行建模。我只是为了完整性才添加它。