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.

“Entity Framework genera nuevas columnas en lugar de utilizar la clave externa mencionada.”

Estoy utilizando el enfoque code-first para crear tablas de base de datos. Cuando ocurre la migración, crea una nueva columna llamada ReceiverUserInfoId en la tabla de base de datos Complaints. He definido la relación de clave externa como:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.HasAnnotation("Relational:Collation", "SQL_Latin1_General_CP1_CI_AS");

    modelBuilder.Entity<Complaint>()
        .HasOne(x => x.ReceiverUserInfo)
        .WithMany()
        .HasForeignKey("ReceivingOfficer")
        .OnDelete(DeleteBehavior.Cascade)
        .IsRequired();
}

Modelo para Complaint. La columna ReceivingOfficer debería estar vinculada a la columna llamada Id en la tabla de base de datos AspNetUsers.

public class Complaint
{
    [Key]
    public int? ComplaintID { get; set; }
    ...
    public string ReceivingOfficer { get; set; }
    ...
    public virtual User ReceiverUserInfo { get; set; }
}

Aquí hay un ejemplo de la clase de modelo User:

public class User : IdentityUser
{
    public string FullName { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateModified { get; set; }
}

Así es como se ve la relación a través de SSMS:

enter image description here

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El código dado muestra el enfoque de “código primero” para crear tablas de base de datos utilizando Entity Framework Core. En este escenario, se crea una nueva columna ReceiverUserInfoId en la tabla Complaints.

    Para definir la relación de clave foránea, se anula el método OnModelCreating y se utiliza el método modelBuilder.Entity<complaint>() para configurar la entidad Complaint. Se utiliza el método HasOne para especificar la propiedad de navegación ReceiverUserInfo. El método WithMany se utiliza para especificar la propiedad de navegación inversa, y el método HasForeignKey se utiliza para especificar el nombre de la columna de clave foránea como ReceivingOfficer. Luego se configura para que se elimine en cascada mediante el método OnDelete y se marca como requerido mediante el método IsRequired.

    El modelo de Complaint tiene una columna de ReceivingOfficer que debe estar vinculada a la columna Id en la tabla AspNetUsers. La propiedad ReceiverUserInfo se utiliza para vincular a la clase modelo de usuario (User), que hereda de la clase IdentityUser y tiene propiedades adicionales como FullName, DateCreated y DateModified.

    Finalmente, el diagrama de SSMS muestra la relación entre las tablas Complaints y AspNetUsers, donde la columna ReceiverUserInfoId apunta a la columna Id en la tabla AspNetUsers.

Comments are closed.