Это касается ответа @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()
.HasOptional(p => p.PrimaryBarOfFoo)
.WithOptionalPrincipal(o => o.PrimaryBar)
.Map(x => x.MapKey("PrimaryBarId"));
. Обратите внимание, что при добавлении PrimaryBarId
необходимо удалить, поскольку мы определяем его с помощью свободного api.
Также обратите внимание, что имя метода [WithOptionalPrincipal()][1]
является своеобразным ироничным. В этом случае Principal Bar. Описание WithOptionalDependent () в msdn делает его более понятным.