0

如何在 Entity Framework 6.2 代码优先中设置自定义外键名称?我有两个班,OrderOrderItem

public partial class Order
{
    public int Id { get; set; }
    public string orderNumber { get; set; }
    public virtual ICollection<OrderItem> orderItems { get; set; }
}

public partial class OrderItem
{
    public string itemNo { get; set; }

    [Column("order_Id")]
    [ForeignKey("CurrentOrder")]

    public int orderId { get; set; }
    public virtual Order CurrentOrder { get; set; }
}

如何使用 Entity Framework 6.2 代码优先设置特定的关系名称,例如“fk_order_items”?将 Order-item 中的 order-id 设置为外键

4

1 回答 1

0

人们倾向于在他们的实体类中使用属​​性来设计数据库中表和列的名称。然而,这限制了实体类的可重用性。

假设您希望您的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");
}

因为您遵循实体框架编码约定来设计一对多,所以您不必在模型构建器中对其进行建模。我只是为了完整性才添加它。

于 2018-11-14T13:49:53.357 回答