Как добавить пользовательское имя внешнего ключа в Entity Framework 6.2? - PullRequest
0 голосов
/ 13 ноября 2018

Как установить имя внешнего внешнего ключа в коде 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 Ответ

0 голосов
/ 14 ноября 2018

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

Предположим, вы хотите, чтобы ваш класс OrderItem находился в двух разных базах данных: в базе данных A каждый 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");
}

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

...