Если у вас есть более одного свойства навигации, ссылающегося на один и тот же объект, EF не знает, к чему принадлежит свойство обратной навигации в другом объекте. В вашем примере: A.ObjectsOfB
относится к B.ObjectA
или к B.OtherObjectsOfA
? И то, и другое было бы возможным и допустимым образцом.
Теперь EF не выдает исключение типа «не может однозначно определить отношения» или что-то в этом роде. Вместо этого он решает, что B.ObjectA
ссылается на третью конечную точку в B
, которая не отображается как свойство навигации в модели. Это создает первый внешний ключ в таблице B
. Два свойства навигации в B
относятся к двум конечным точкам в A
, которые также не представлены в модели: B.ObjectA
создает второй внешний ключ в таблице B
, а B.OtherObjectsOfA
создает внешний ключ в таблице A
.
Чтобы исправить это, вы должны явно указать отношения.
Первый вариант (самый простой) — использовать атрибут InverseProperty
:
public class A
{
public int Id { get; set; }
public string Name { get; set; }
[InverseProperty("OtherObjectsOfA")]
public virtual ICollection<B> ObjectsOfB { get; set; }
}
Это определяет, что A.ObjectsOfB
является частью отношения "многие ко многим" к B.OtherObjectsOfA
.
Другой вариант — полностью определить отношения в Fluent API:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<A>()
.HasMany(a => a.ObjectsOfB)
.WithMany(b => b.OtherObjectsOfA)
.Map(x =>
{
x.MapLeftKey("AId");
x.MapRightKey("BId");
x.ToTable("ABs");
});
modelBuilder.Entity<B>()
.HasRequired(b => b.ObjectA) // or HasOptional
.WithMany()
.WillCascadeOnDelete(false); // not sure if necessary, you can try it
// without if you want cascading delete
}
person
Slauma
schedule
22.11.2011