1

У меня есть два класса, каждый из которых имеет один первичный ключ (также проверяется в БД - есть только один ключ, а только один столбец - ПК).Почему требуется использовать аннотацию данных столбца, когда нет составных клавиш?

public class Sub1 
{ 
    [Key]public int Id {get; set;} 
    [Required]public int Value {get; set;} 
} 

public class Sub2 
{ 
    [Key]public int Id {get; set;} 
    [Required]public int Value {get; set;} 
} 

Затем я добавляю третий класс, который использует столбцы Id в двух вышеуказанных как внешние ключи.

public class Sup 
{ 
    [Key]public int Id { get; set; } 
    [ForeignKey(Sub1)]public int Sub1Id { get; set; } 
    [ForeignKey(Sub2)]public int Sub2Id { get; set; } 
    public virtual Sub1 { get; set; } 
    public virtual Sub2 { get; set; } 
} 

Когда я пытаюсь запустить Add-Migration, я получаю ошибку ниже. Нет составных первичных ключей, и у меня нет нескольких первичных ключей в любом месте. Когда я добавляю атрибут Column, он работает, но я чувствую, что это не обязательно (следовательно, я подозреваю, что я делаю что-то не так).

Невозможно определить составной внешний ключ для внешнего ключа по типу Beep.Bapp.Thing. При использовании аннотации данных ForeignKey на составных внешних ключах ключ гарантирует, что порядок задается с помощью аннотации данных столбца или свободного API.


В this answer, есть класс Категория и здесь я Хтат нам нужно добавить столбцы приказывая информацию.

public class Category 
{ 
    [Key, Column(Order = 0)] 
    public int CategoryId2 { get; set; } 
    [Key, Column(Order = 1)] 
    public int CategoryId3 { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Product> Products { get; set; } 
} 

public class Product 
{ 
    [Key] 
    public int ProductId { get; set; } 
    public string Name { get; set; } 
    [ForeignKey("Category"), Column(Order = 0)] 
    public int CategoryId2 { get; set; } 
    [ForeignKey("Category"), Column(Order = 1)] 
    public int CategoryId3 { get; set; } 

    public virtual Category Category { get; set; } 
} 

ответ

0

Я не знаю, как ваш код был составлен вообще. Попробуйте следующие модели:

public class Sub1 
{ 
    [Key] 
    public int Id {get; set;} 
    [Required] 
    public int Value {get; set;} 
} 

public class Sub2 
{ 
    [Key] 
    public int Id {get; set;} 
    [Required] 
    public int Value {get; set;} 
} 

public class Sup 
{ 
    [Key] 
    public int Id { get; set; } 
    public int Sub1Id { get; set; } 
    public int Sub2Id { get; set; } 
    public virtual Sub1 Sub1 { get; set; } 
    public virtual Sub2 Sub2 { get; set; } 
} 
+0

Вы не говорите EF, что это иностранные ключи. Как он узнает, что при миграции в обновлении –

+0

Поле Sub1 является внешним ключом, поскольку имеет тип Sub1. И поле Sub1Id содержит это значение внешнего ключа из-за ** соглашения синтаксиса EF **: Sub1Id = "Sub1" + "ID". –

+0

А, так он работает с ID и Id? Я думал, что это было только одно, если они и, никогда не помня, что есть, я всегда использую это явно. Но вы говорите, что обе альтернативы будут создавать изменения в моей * Up() *? Хорошо знать. –