Как указать соединительную клавишу в рамках объекта первым
-
08-10-2019 - |
Вопрос
У меня есть быстрый вопрос о настройке сопоставлений между [Order Details]
, [Products]
а также [Orders]
в северной ведении данных.
[Order Details]
не имеет первичного ключа и выглядит так
[Order Details]
OrderId (int)
ProductId (int)
...
Так что мой вопрос, как я (и могу я) настроить мой OrderDetails
Класс работает так?
public class OrderDetails
{
public virtual Order Order { get; set; }
public virtual Product Product { get; set; }
public Decimal UnitPrice { get; set; }
public int Quantity { get; set; }
public Decimal Discount { get; set; }
}
Мой контекст данных выглядит так
public class NorthwindDb : DbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetails> OrderDetails { get; set; }
public DbSet<Customer> Customers { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new OrderDetailsConfiguration());
}
public static void InitializeBecauseOfThatWeirdMetaDataThingThatIDontUnderstandYet()
{
Database.SetInitializer<NorthwindDb>(null);
}
}
И мой OrderDetailsConfiguration
(пусто, потому что я не знаю, что я делаю)
public class OrderDetailsConfiguration : EntityConfiguration<OrderDetails>
{
public OrderDetailsConfiguration()
{
//HasKey(x => x.Order.OrderId);
//HasKey(x => x.Product.ProductId);
}
}
Любые подсказки или идеи были бы здоровы.
Решение
Сначала вам придется явно поставить в PKS и FKS внутри Информация для заказа сорт:
public class OrderDetails
{
public int OrderID { get; set; }
public int ProductID { get; set; }
public virtual Order Order { get; set; }
public virtual Product Product { get; set; }
public Decimal UnitPrice { get; set; }
public int Quantity { get; set; }
public Decimal Discount { get; set; }
}
Затем со следующим кодом вы можете указать PKS для Показатель управления сорт:
(Обратите внимание, что в Северный ветер База данных обоих Номер заказа а также Идантификационный номер продукта являются PKS для Информация для заказа стол).
public class OrderDetailsConfiguration : EntityConfiguration<OrderDetails>
{
public OrderDetailsConfiguration()
{
HasKey(od => new
{
od.ProductID,
od.OrderID
});
}
}
А также можно использовать Воссоздатьatabaseifmodelchanges Стратегия, чтобы заставить вашу базу данных воссоздать каждый раз, когда вы изменяете модель класса:
Database.SetInitializer<NorthwindDb>(
new RecreateDatabaseIfModelChanges<NorthwindDb>());
Интересный момент в том, что после того, как вы сделали эти изменения, EF автоматически выводится ФКС из Информация для заказа класс и создать отношения к Заказывает а также Продукты Таблица на ardiD и ProductiD на основе Первые конвенции для кода:
Код сначала сделает вывод, что любое свойство по имени
<navigation property name><primary key property name>
(то есть продуктыПродуктивные),<principal class name><primary key property name>
(то есть продуктапродуктид) или<primary key property name>
(т.е. productiD), с тем же типом данных, что и основной ключ, представляет собой внешний ключ для отношений. Если обнаружены несколько совпадений, то приоритет приведен в указанном выше порядке. Иностранное обнаружение ключей не будет чувствительным к регистру.
Другие советы
Отметьте поля ключей с атрибутом [KEY]. Вам нужно будет добавить [столбец (заказ = х)] в случае сложных клавиш, x = 0, 1, 2, ... нумерация может начать с любого числаhttps://msdn.microsoft.com/en-us/data/jj591583.aspx.