es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

EF6 genera claves foráneas extrañas.

Estoy teniendo un pequeño problema al usar EF6. Estos son mis modelos (bueno, estoy omitiendo las propiedades no relevantes):
“`cs
[Table("Departments")]
public class Department
{
public string Id { get; set; }

<pre><code>public string Name { get; set; }
public string Description { get; set; }

public IList<Staff> Staff { get; set; }

public Staff HOD { get; set; }
</code></pre>

}

[Table("Staff")]
public class Staff
{
[Key]
public string EmployeeId { get; set; }

<pre><code>public string Name { get; set; }

public Department Department { get; set; }
</code></pre>

}
“`

Esta es la migración que está generando EF6 (bueno, solo los métodos de creación):
“`cs
CreateTable(
"dbo.Staff",
c => new
{
EmployeeId = c.String(nullable: false, maxLength: 128),
Name = c.String(),
Department<em>Id = c.String(maxLength: 128),
Department</em>Id1 = c.String(maxLength: 128),
})
.PrimaryKey(t => t.EmployeeId)
.ForeignKey("dbo.Departments", t => t.Department<em>Id)
.ForeignKey("dbo.Departments", t => t.Department</em>Id1)
.Index(t => t.Department<em>Id) //¿qué es esto?
.Index(t => t.Department</em>Id1); //¿qué es esto?</p>

CreateTable(
"dbo.Departments",
c => new
{
Id = c.String(nullable: false, maxLength: 128),
Name = c.String(),
Description = c.String(),
HOD<em>EmployeeId = c.String(maxLength: 128),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Staff", t => t.HOD</em>EmployeeId)
.Index(t => t.HOD_EmployeeId);

“`

Eche un vistazo a las claves foráneas generadas. Algo parece estar mal. ¿Cómo puedo corregir esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Las claves foráneas generadas por EF6 en la migración están apuntando a la misma tabla, ‘dbo.Departments’, en lugar de ‘dbo.Staff’. Esto se debe a la forma en que se define la propiedad de navegación del Departamento en el modelo Staff.

    Para corregir esto, necesitamos agregar explícitamente el atributo ForeignKey en la propiedad de navegación del Departamento en el modelo Staff. Modifique el modelo Staff de la siguiente manera:

    [Table("Staff")]
    public class Staff
    {
        [Key]
        public string EmployeeId { get; set; }
        public string Name { get; set; }
    
        [ForeignKey("Department")]
        public string DepartmentId { get; set; }
    
        public Department Department { get; set; }
    }
    

    Aquí hemos agregado explícitamente el atributo ForeignKey en la propiedad de navegación del Departamento y especificamos la propiedad de clave foránea relacionada como ‘DepartmentId’. Esto debería generar las claves foráneas correctamente en la migración.

    Una vez que hayamos hecho este cambio, debemos regenerar la migración con el siguiente comando en la Consola del Administrador de Paquetes:

    Add-Migration FixStaffDepartmentRelationships
    

    Esto debería generar una nueva migración que actualice las claves foráneas correctamente.

Comments are closed.