简体   繁体   English

如何在Entity Framework 6.2中添加外键自定义名称?

[英]How to add foreign key custom name in Entity Framework 6.2?

How to set custom foreign key name in Entity Framework 6.2 code-first? 如何在Entity Framework 6.2代码优先中设置自定义外键名称? I have two classes, Order and OrderItem . 我有两个类, 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; }
}

How to set specific relation name such as 'fk_order_items' using Entity Framework 6.2 code-first? 如何使用Entity Framework 6.2代码优先设置特定的关系名称,例如“ fk_order_items”? Set order-id in Order-item as foreign key 将订单项中的订单ID设置为外键

People tend to use attributes in their entity classes to design the names of the tables and columns in the database. 人们倾向于在实体类中使用属​​性来设计数据库中表和列的名称。 However that limits reusability of the entity classes. 但是,这限制了实体类的可重用性。

Suppose you want your OrderItem class in two different databases: in database A every OrderItem has a foreign key to the Order that it belongs to named OrderId , in database B you want a foreign key named order_id . 假设您要在两个不同的数据库中使用OrderItem类:在数据库A中,每个OrderItem都有一个属于其的Order的外键,名为OrderId ;在数据库B中,您需要一个名为order_id的外键。

Yet you are a good programmer, your classes are very popular, and you don't want to disappoint the users of your classes by limiting their usage. 但是,您是一名优秀的程序员,您的类非常受欢迎,并且您不想通过限制类的使用而使他们失望。 Hence you use fluent API to design the database instead of attributes. 因此,您可以使用流畅的API来设计数据库而不是属性。

Fluent API is used in your overrid of DbContext.OnModelCreating 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");
}

Because you followed the entity framework coding conventions to design your one-to-many, you won't have to model it in your model builder. 因为您遵循实体框架编码约定来设计一对多,所以您不必在模型构建器中对其进行建模。 I only added it for completeness. 我只是为了完整性而添加它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM