15

¿Cómo debería definir relaciones utilizando código de Primera, sin usar las propiedades de navegación?Código EF4 Primero: cómo agregar una relación sin la adición de una propiedad de navegación

Anteriormente he definido uno-muchos y muchos-Muchos mediante el uso de propiedades de navegación en ambos extremos de la relación. Y las relaciones apropiadas se crean en la base de datos. Aquí hay una versión simplificada de cómo se ven las clases (he convertido las relaciones Muchos-Muchos a uno-muchos para simplificar).

public class User 
{ 
    public string UserId { get; set; } 
    public string PasswordHash { get; set; } 
    public bool IsDisabled { get; set; } 
    public DateTime AccessExpiryDate { get; set; } 
    public bool MustChangePassword { get; set; } 

    public virtual Role Role { get; set; } 
} 

public class Role 
{ 
    public int RoleId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 

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

public class Right 
{ 
    public Guid RightId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 

    public virtual Role Role { get; set; } 
} 

Sin embargo, si quito las propiedades de navegación, se están creando no tener ningún conflicto. Así es como se verían las clases.

public class User 
{ 
    public string UserId { get; set; } 
    public string PasswordHash { get; set; } 
    public bool IsDisabled { get; set; } 
    public DateTime AccessExpiryDate { get; set; } 
    public bool MustChangePassword { get; set; } 

    public int Role RoleId { get; set; } 
} 

public class Role 
{ 
    public int RoleId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
} 

public class Right 
{ 
    public Guid RightId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 

    public int RoleId { get; set; } 
} 

observe que en lugar de una propiedad de navegación, tengo la clave principal de la tabla relacionada. Todo se crea en la mesa, excepto la relación. Entonces, ¿cómo puedo hacer esto?

Por cierto, he intentado varias combinaciones en el método de la OnModelCreating dbcontext pero fue en vano. ¡Cualquier ayuda es muy apreciada!

Gracias, Mel

Respuesta

24

creo que siempre se necesita propiedad de navegación en al menos un lado cuando se utiliza código en primer lugar. A continuación, podrá asignarlo:

public class User 
{  
    public string UserId { get; set; }  
    public string PasswordHash { get; set; }  
    public bool IsDisabled { get; set; }  
    public DateTime AccessExpiryDate { get; set; }  
    public bool MustChangePassword { get; set; }  
    public int RoleId { get; set; } 
    public Role Role { get; set; } 
} 

public class Role 
{  
    public int RoleId { get; set; }  
    public string Name { get; set; }  
    public string Description { get; set; } 
} 

public class Right 
{  
    public Guid RightId { get; set; }  
    public string Name { get; set; }  
    public string Description { get; set; }  
    public int RoleId { get; set; } 
    public Role Role { get; set; } 
} 

public class TestContext : DbContext 
{ 
    public TestContext() : base("Entities") 
    {} 

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<User>() 
      .HasRequired(r => r.Role) 
      .WithMany() 
      .HasForeignKey(r => r.RoleId); 

     modelBuilder.Entity<Right>() 
      .HasRequired(r => r.Role) 
      .WithMany() 
      .HasForeignKey(r => r.RoleId); 
    } 
} 
+0

he sospechado. Gracias por el ejemplo. He intentado usar las propiedades de navegación junto con la clave externa, pero la clave externa no está poblada, pero parece que la respuesta está en su ejemplo. ¡Gracias! – Mel

+0

¿Necesitaría definir las propiedades de ID si existe una propiedad para el objeto real? Entonces, en el objeto Usuario, ¿debería definir RoleId o solo por conveniencia? – DDiVita

+1

@DDiVita: Es una gran diferencia si se define '' RoleId' en User' o no. Recomiendo esta respuesta para ver una diferencia: http://stackoverflow.com/questions/5281974/code-first-independent-associations-vs-foreign-key-associations/5282275#5282275 –

0

En EF 4.3, puede agregar una migración que agregue la relación.

+0

Esta respuesta se beneficiaría de un ejemplo de cómo para usar esa característica. – ryanyuyu

1

Puede usar el fluent api para agregar la relación, aunque el código de "configuración" es independiente del código de entidad, por lo que es menos reconocible.

Cuestiones relacionadas