Questo è in riferimento alla risposta di @Ladislav Mrnka sull'uso di API fluenti per la configurazione della relazione uno a uno.
Ha avuto una situazione in cui FK of dependent must be it's PK
non era fattibile.
Ad esempio, Foo
ha già una relazione uno-a-molti con 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;
}
Ora, abbiamo dovuto aggiungere un'altra relazione uno a uno tra Foo e 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;
}
Ecco come specificare una relazione uno a uno usando api fluente:
modelBuilder.Entity<Bar>()
.HasOptional(p => p.PrimaryBarOfFoo)
.WithOptionalPrincipal(o => o.PrimaryBar)
.Map(x => x.MapKey("PrimaryBarId"));
Si noti che durante l'aggiunta PrimaryBarId
deve essere rimosso, poiché lo specifichiamo tramite API fluente.
Si noti inoltre che il nome del metodo [WithOptionalPrincipal()][1]
è un po 'ironico. In questo caso, Principal è Bar. La descrizione WithOptionalDependent () su msdn lo rende più chiaro.