#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
- Class1_Id
- 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 Спасибо за совет, это был всего лишь намек. Я добавил некоторые атрибуты, если вы считаете, что это необходимо.