2011-09-29 17 views
12

Mi Modelo:EF-Code primer tipo complejo con una propiedad de navegación

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; } 

} 

Al generar la base de datos, me sale:

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. 

¿Cómo tienen una propiedad de navegación dentro de un tipo complejo? Si elimino la propiedad de navegación del país, funciona bien.

Respuesta

10

Las propiedades de navegación (referidas a otras entidades) en un tipo complejo no son compatibles. Debe hacer de su Location una entidad (con su propia tabla) o eliminar la propiedad de navegación Country del Location (y agregar el atributo [ComplexType] mencionado por Steve Morgan).

Editar

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

"tipo complejo no puede contener propiedades de navegación."

+0

¿Pero qué pasa con el entero 'CountryID' dentro de la clase' Location'? ¿Es posible hacer eso una restricción de clave externa? (Tengo un problema similar y no puedo hacer que funcione) –

+0

@Isak: No, no es posible. Si desea tenerlo en la base de datos de FK, debe hacerlo directamente en la base de datos, pero EF no lo reflejará. –

+1

El hecho de que esto no se admite se menciona directamente en Descripción de tipo complejo en MSDN: http://msdn.microsoft.com/en-us/library/bb738472.aspx –

3

EF quiere inferir una clave principal para la ubicación, pero no puede.

Agregue public int LocationId { get; set; } a la clase Location y debería ser feliz.

Si desea utilizar Location como un tipo complejo, anótelo con un atributo [ComplexType].

+0

Esto generará una tabla completamente nueva. Lo quiero como un tipo complejo. –

+0

Lo siento, edité mi respuesta, espero que ayude. –

Cuestiones relacionadas