2014-05-08 17 views
39

Ho pensato che potrebbe essere utile ottenere una risposta definitiva su quando utilizzare WithOptionalDependent e quando utilizzare WithOptionalPrincipal. L'aiuto per le due funzioni è un po 'poco chiaro, e mi trovo a scavare attraverso più risposte Stack Overflow e risposte su altri siti che combinano le risposte al fine di sentirsi sicuri di avere la relazione andando nella giusta direzione.WithOptionalDependent vs WithOptionalPrinciple - Risposta definitiva?

Ecco cosa dice MSDN su WithOptionalDependent:

di configurare il rapporto di essere facoltativa: facoltativa, senza una proprietà di navigazione sul lato opposto della relazione. Il tipo di entità in fase di configurazione sarà dipendente e contiene una chiave esterna nell'entità. Il tipo di entità che gli obiettivi della relazione saranno il principale nella relazione.

e qui è quello che dice di WithOptionalPrincipal:

di configurare il rapporto di essere facoltativa: facoltativa, senza una proprietà di navigazione sul lato opposto della relazione. Il tipo di entità in fase di configurazione sarà il principale nella relazione. Il tipo di entità che i target di relazione saranno dipendenti e contiene una chiave esterna per l'entità.

La riga "Il tipo di entità in fase di configurazione" è la parte che mi confonde sempre (e ne assumo altri).

In questo esempio:

class MyEntityA 
{ 
    [Key] 
    public int Id { get; set; } 
    public int BId { get; set; } 
    [ForeignKey("BId")] 
    public MyEntityB B { get; set; } 
} 

class MyEntityB 
{ 
    [Key] 
    public int Id { get; set; } 
} 

modelBuilder.Entity<MyEntityA>().HasOptional(a => a.B).WithOptionalDependent(); 

è "il tipo di entità essendo configurato" riferendosi MyEntityA o MyEntityB? Presumo che sia il primo.

Se è corretto, quale è un esempio di quando si utilizza WithOptionalPrincipal?

In realtà penso nel mio esempio di codice che dovrebbe essere in realtà WithMany e nessuna delle opzioni WithOptional. Chiaramente sono ancora confuso!

Ci sono sovraccarichi per entrambe queste funzioni che portano la proprietà di navigazione nell'altra direzione. Presumo che questi sovraccarichi non cambino quelle risposte, ma per favore correggimi se sbaglio.

Spero che questo sia utile anche per la comunità più grande.

risposta

10

Per exmaple, è possibile modificare il proprio EntityB tramite la proprietà di navigazione e rendere nullable BId (poiché si tratta di relazione facoltativa).

class MyEntityA 
{ 
    [Key] 
    public int Id { get; set; } 
    public int? BId { get; set; } 

    [ForeignKey("BId")] 
    public virtual MyEntityB B { get; set; } 
} 

class MyEntityB 
{ 
    [Key] 
    public int Id { get; set; } 

    public virtual MyEntityA A { get; set; } 
} 

allora possiamo usare:

modelBuilder.Entity<MyEntityB>().HasOptional(a => a.A).WithOptionalPrincipal(); 

MyEntityA ha FK a MyEntityB, così nel vostro exapmle di configurare e utilizzare MyEntityA WithOptionalDependent.Ma è possibile avviare la configurazione da MyEntityB -side, quindi è necessario WithOptionalPrincipal.

4

La risposta alla tua domanda è: "Il tipo di entità che si sta configurando" è MyEntityA

Questo può essere visto in via definitiva, cercando al documentation per

OptionalNavigationPropertyConfiguration<TEntityType, TTargetEntityType> 

che è il tipo restituito da HasOptional e che dice:

TTargetEntityType

Il tipo di entità che la relazione ha come target.

che fornisce più contesto per le frasi:

Il tipo di entità in fase di configurazione

Il tipo di entità che il rapporto si rivolge

Quindi, nel tuo caso si torna da HasOptional an

OptionalNavigationPropertyConfiguration<MyEntityA, MyEntityB> 

Così, WithOptionalDependent significa che MyEntityB sarà il preside con una optional Esplorazione della struttura che puntano al MyEntityA (specificato tramite il parametro lambda del sovraccarico) e MyEntityA sarà il Dipendente e contengono una chiave esterna e di proprietà di navigazione (come specificato nella il parametro lambda di HasOptional). Questo è lo scenario nel tuo modello.

Al contrario, significa che WithOptionalPrincipalMyEntityA sarà il presidente e MyEntityB il dipendente con chiave esterna e di proprietà di navigazione.

Problemi correlati