как создать составной ключ, который сначала содержит внешний ключ с кодом?

Сначала я использую код EF4 и хочу создать составной ключ, состоящий из свойства класса и внешнего ключа. У меня есть два класса: Order и Company. Класс Order содержит ссылку, но она не обязательно будет уникальной для разных компаний. Поэтому я намерен использовать составной ключ, состоящий из Reference и Company.CompanyId.

Я попытался использовать следующее, чтобы установить его, но получаю сообщение об ошибке «Выражение ключа недопустимо».

modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.Company.CompanyId });

я тоже пробовал

modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.Company });

и это не удается.

это мои классы:

public class Order
{
   public string Reference { get; set; }
   public Company Company { get; set; }
}

public class Company
{
   public int CompanyId { get; set; }
   public virtual ICollection Orders { get; set; }
}

Любая помощь будет принята с благодарностью.


person user482833    schedule 21.10.2010    source источник


Ответы (4)


Как упомянул Энтони Хайски, в ключе можно использовать только скалярные свойства. Итак, вам нужно будет добавить внешний ключ (скалярное свойство) в класс Order и связать его со свойством навигации Company, как показано ниже:

public class Order
{
    public string Reference { get; set; }

    public int CompanyId { get; set; }

    [RelatedTo(ForeignKey = "CompanyId")]
    public Company Company { get; set; }
}

А затем создайте составной ключ с помощью построителя моделей:

modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.CompanyId }); 

Обратите внимание, что аннотации данных (атрибут RelatedTo) были введены в Entity Framework CTP 3. Чтобы узнать о другом варианте, который использует только аннотации данных вместо метода HasKey, см. этот пост:

person Luis Rocha    schedule 20.11.2010

Одна вещь, которая выглядит не совсем правильно, — это использование вами неуниверсальной версии ICollection. Попробуй это:

public virtual ICollection<Order> Orders { get; set; }
person gxclarke    schedule 28.10.2010

Вы пробовали это?

modelBuilder.Entity().HasKey(o =>o.Reference ); modelBuilder.Entity().HasKey(o =>o.CompanyId);

person Patrick.Xiong    schedule 12.11.2010

Согласно этому источнику в ключе разрешены только скалярные свойства. Навигационных свойств нет.

person Antony    schedule 19.11.2010