“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:
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 tablaComplaints
.Para definir la relación de clave foránea, se anula el método
OnModelCreating
y se utiliza el métodomodelBuilder.Entity<complaint>()
para configurar la entidadComplaint
. Se utiliza el métodoHasOne
para especificar la propiedad de navegaciónReceiverUserInfo
. El métodoWithMany
se utiliza para especificar la propiedad de navegación inversa, y el métodoHasForeignKey
se utiliza para especificar el nombre de la columna de clave foránea comoReceivingOfficer
. Luego se configura para que se elimine en cascada mediante el métodoOnDelete
y se marca como requerido mediante el métodoIsRequired
.El modelo de
Complaint
tiene una columna deReceivingOfficer
que debe estar vinculada a la columnaId
en la tablaAspNetUsers
. La propiedadReceiverUserInfo
se utiliza para vincular a la clase modelo de usuario (User
), que hereda de la claseIdentityUser
y tiene propiedades adicionales comoFullName
,DateCreated
yDateModified
.Finalmente, el diagrama de SSMS muestra la relación entre las tablas
Complaints
yAspNetUsers
, donde la columnaReceiverUserInfoId
apunta a la columnaId
en la tablaAspNetUsers
.