Как добавить пользовательское имя внешнего ключа в 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");
}
Поскольку вы следовали соглашениям о кодировании сущностной структуры, чтобы проектировать один-ко-многим, вам не нужно будет моделировать его в конструкторе моделей. Я только добавил это для полноты.