Конфигурация составного ключа в первой модели кода EF6

#asp.net #entity-framework #one-to-one

Вопрос:

У меня есть 3 таблицы, 2 таблицы являются основными, а 3-я-зависимая таблица, ниже приведена структура.

 public class Class1
{
     public int Id;
     public string Name;

     public Class3 Class3Property;
}

public class Class2
{
     public int Id;
     public string Name;

     public Class3 Class3Property;
}

public class Class3
{
     [Key, ForeignKey("Class1Property"), Column(Order = 1)]
     public int Class1Id;
     [Key, ForeignKey("Class2Property"), Column(Order = 2)]
     public int Class2Id;

     public Class1 Class1Property;
     public Class2 Class2Property;
}
 

Это работает, но создает дополнительные свойства в классе 3

  1. Class1_Id
  2. Class2_Id

Как избежать добавления этих дополнительных полей.

Комментарии:

1. Вы действительно намерены Class1 и Class3 хотите иметь отношения 1:1? (и Class2 и Class3 )

Ответ №1:

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

 public class Class1
{
     public int Id;
     public string Name;

     public Virtual ICollection <Class3> Class3Properties;
}

public class Class2
{
     public int Id;
     public string Name;

     public vitural ICollection<Class3> Class3Properties;
}

public class Class3
{
     [Key,  Column(Order = 1)]
     public int Class1Id;
     [Key,, Column(Order = 2)]
     public int Class2Id;

     [ForeignKey("Class1Id")],
     public Class1 Class1;
      [ForeignKey("Class2Id")]
     public Class2 Class2;
}
 

вам не нужна третья таблица для одного к одному , было бы достаточно 2 таблиц, если вы используете старый ef6, ваш код может быть

 public class Class1
{    
     [Key]
     public int Id {get; set;}
     public string Name {get;set;}
     
    [Index( "INDEX_Class2", IsClustered=false, IsUnique=true )]   
     public int Class2Id {get; set;}

     ForeignKey(nameof(Class2Id))]
    [InverseProperty("Class1")]
     public virtual  Class2 Class2 {get; set;}
    
}

public class Class2
{
      [Key]
     public int Id { get; set;}
     public string Name {get; set;}
     [InverseProperty("Class2")]
     public vitural ICollection<Class1> Class1 {get; set;};
}
 

Комментарии:

1. Речь идет об EF6, который без дальнейшего уведомления следует понимать как старый EF6. Кроме того, если бы вы протестировали код, вы бы заметили, что что-то не так.

2. @GertArnold Спасибо за совет, это был всего лишь намек. Я добавил некоторые атрибуты, если вы считаете, что это необходимо.