2011-09-29 4 views
12

il mio modello:EF-Code primo tipo complesso con una proprietà di navigazione

public class Country 
{ 
    public int CountryId { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
} 

public class Location 
{ 
    public string Address { get; set; } 

    public virtual int CountryId { get; set; } 
    public virtual Country Country { get; set; } 
}  

public class User{ 

    protected User() 
    { 
     Location = new Location(); 
    } 

    public int UserId { get; set; } 
    public Location Location { get; set; } 

} 

Quando si genera il database, ottengo:

One or more validation errors were detected during model generation: 

System.Data.Edm.EdmEntityType: : EntityType 'Location' has no key defined. Define the key for this EntityType. 
System.Data.Edm.EdmEntitySet: EntityType: EntitySet �Locations� is based on type �Location� that has no keys defined. 

Come faccio ad avere una proprietà di navigazione all'interno di un tipo complesso? Se rimuovo la proprietà di navigazione del Paese, funziona correttamente.

risposta

10

Le proprietà di navigazione (che fanno riferimento ad altre entità) su un tipo complesso non sono supportate. È necessario creare l'entità Location (con la propria tabella) o rimuovere la proprietà di navigazione Country da Location (e aggiungere l'attributo [ComplexType] come menzionato da Steve Morgan).

Modifica

Riferimento: http://msdn.microsoft.com/en-us/library/bb738472.aspx

"Complex Tipo non può contenere proprietà di navigazione"

+0

Ma per quanto riguarda l'intero 'CountryID' nella classe' Location'? È possibile renderlo un vincolo di chiave esterna? (Ho un problema simile e non riesco a farlo funzionare) –

+0

@Isak: No, non è possibile. Se vuoi avere FK nel database devi farlo direttamente nel database ma EF non lo rifletterà. –

+1

Il fatto che questo non sia supportato viene menzionato direttamente nella descrizione del tipo Complesso su MSDN: http://msdn.microsoft.com/en-us/library/bb738472.aspx –

3

EF desidera inferire una chiave primaria per Posizione, ma non può.

Aggiungi un public int LocationId { get; set; } alla classe Location e dovrebbe essere felice.

Se si desidera utilizzare Location come tipo complesso, annotarlo con un attributo [ComplexType].

+0

Questo genererà una tabella completamente nuova. Lo voglio come un tipo complesso. –

+0

Mi dispiace - ha modificato la mia risposta - spero che aiuti. –