Как создать составной ключ, который сначала включает внешний ключ с кодом? - PullRequest
2 голосов
/ 21 октября 2010

Сначала я использую код EF4 и хочу создать составной ключ, который состоит из свойства класса и внешнего ключа.У меня есть два класса: заказ и компания.Класс 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; }
}

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

Ответы [ 4 ]

5 голосов
/ 20 ноября 2010

Как упоминал Энтони Хайски, в ключе можно использовать только скалярные свойства.Таким образом, вам необходимо добавить внешний ключ (скалярное свойство) в класс 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см. этот пост:

1 голос
/ 12 ноября 2010

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

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

1 голос
/ 28 октября 2010

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

public virtual ICollection<Order> Orders { get; set; }
0 голосов
/ 20 ноября 2010

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

...