Как указать соединительную клавишу в рамках объекта первым

StackOverflow https://stackoverflow.com/questions/4158859

Вопрос

У меня есть быстрый вопрос о настройке сопоставлений между [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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top