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