Как добавить пользовательское имя внешнего ключа в Entity Framework 6.2?

Как установить собственное имя внешнего ключа в коде Entity Framework 6.2 в первую очередь? У меня есть два класса, Order а также OrderItem,

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; }
}

Как установить конкретное имя отношения, например, "fk_order_items", используя Entity Framework 6.2 с первым кодом? Установить идентификатор заказа в Order-item как внешний ключ

1 ответ

Люди склонны использовать атрибуты в своих классах сущностей для проектирования имен таблиц и столбцов в базе данных. Однако это ограничивает возможность повторного использования классов сущностей.

Предположим, вы хотите, чтобы ваш OrderItem класс в двух разных базах данных: в базе данных каждый OrderItem имеет внешний ключ к Order что он принадлежит к имени OrderId в базе данных B вы хотите внешний ключ с именем order_id,

Тем не менее, вы хороший программист, ваши классы очень популярны, и вы не хотите разочаровывать пользователей ваших классов, ограничивая их использование. Следовательно, вы используете свободный API для проектирования базы данных вместо атрибутов.

Свободный 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");
}

Поскольку вы следовали соглашениям о кодировании сущностной структуры, чтобы проектировать один-ко-многим, вам не нужно будет моделировать его в конструкторе моделей. Я только добавил это для полноты.

Другие вопросы по тегам