Это со ссылкой на ответ @Ladislav Mrnka об использовании беглого API для настройки отношения один-к-одному.
Была ситуация, когда FK of dependent must be it's PK
было невозможно.
Например, Foo
уже имеет отношение один-ко-многим с Bar
.
public class Foo {
public Guid FooId;
public virtual ICollection<> Bars;
}
public class Bar {
//PK
public Guid BarId;
//FK to Foo
public Guid FooId;
public virtual Foo Foo;
}
Теперь нам нужно было добавить еще одно отношение-к-одному между Foo и Bar.
public class Foo {
public Guid FooId;
public Guid PrimaryBarId;// needs to be removed(from entity),as we specify it in fluent api
public virtual Bar PrimaryBar;
public virtual ICollection<> Bars;
}
public class Bar {
public Guid BarId;
public Guid FooId;
public virtual Foo PrimaryBarOfFoo;
public virtual Foo Foo;
}
Вот как задать отношение один-к-одному, используя свободный API:
modelBuilder.Entity<Bar>()
.HasOptional(p => p.PrimaryBarOfFoo)
.WithOptionalPrincipal(o => o.PrimaryBar)
.Map(x => x.MapKey("PrimaryBarId"));
Обратите внимание, что при добавлении PrimaryBarId
необходимо удалить, так как мы указываем его через свободный API.
Также обратите внимание, что имя метода [WithOptionalPrincipal()][1]
выглядит довольно иронично.В этом случае Принципал - Бар. WithOptionalDependent () описание в msdn делает его более понятным.