Il mio modello di dati è sotto. UserPhone
è obbligatorio ma la proprietà di navigazione è facoltativa purché la tabella User
possa essere vuota:
public class Request
{
[Key]
public int Id {get;set;}
[Required]
public string UserPhone {get;set;}
[ForeignKey("UserPhone")]
public virtual User User {get;set;}
}
public class User
{
[Key]
public string UserPhone {get;set;}
}
La tabella User
s viene popolata dopo che una richiesta è stata inserita nel sistema. E da qualche parte tra la richiesta è inserita e l'utente non è popolato Sto cercando di recuperare tutte le richieste con un utente, se esiste (outer join).
db.Requests.Include(r=>r.User).FirstOrDefault();
Il che mi dà zero risultati perché EF ha fatto inner join (il mio campo UserPhone
è definito e una chiave esterna ed è richiesto per la tabella Richieste).
Come posso definire correttamente la mappatura per poter usare la mappatura includi? Mi serve l' include
perché il mio caso ha toccato molti altri tavoli che vorrei fare tutti con i join manuali
Lo fa INNER JOIN
perché hai configurato la proprietà FK come [ Required
]. Quindi dal punto di vista EF dovrebbe sempre esistere il record User
correlato.
In caso contrario, significa che il modello e il database non sono sincronizzati. Rimuovere l'annotazione [ Required
] dalla proprietà Request.UserPhone
e il gioco è fatto.
Aggiornamento: EF si affida molto ai metadati del modello forniti attraverso convenzioni, annotazioni di dati e configurazione fluente. Tutte le decisioni sono prese sulla base di tali informazioni. Ad esempio, quando si configura una proprietà primitiva persistente come richiesto, tutti i controlli null
contro quella proprietà nella query verranno rimossi e risolti al momento della conversione della query su costante true
o false
. Lo stesso vale per le relazioni. All'interno delle query (e Include
è un costrutto di query specifico) vengono utilizzate da EF per determinare la cardinalità dei join e il tipo dei join. Quando si esegue una query su un lato della relazione, la proprietà Required
/ Optional
di FK controlla se viene generato un join LEFT OUTER
INNER
o LEFT OUTER
.
Pertanto, l'unico modo per controllare i comportamenti EF è fornirli con i metadati corretti dal modello dell'entità. Non c'è modo di controllare / alterare dinamicamente il comportamento di una specifica operazione.