Это со ссылкой на ответ @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;
}
Теперь нам пришлось добавить еще одно отношение один к одному между Фу и Баром.
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 делает его более понятным.