c# - many - fluent api entity framework core
Uno a cero o uno con HasForeignKey (2)
De acuerdo, me di cuenta de eso: deberías usar WithMany
(sí, no obvio) para almacenar una clave foránea en alguna propiedad:
Property(e => e.PersonId).HasColumnName("person_id");
HasRequired(e => e.Person)
.WithMany()
.HasForeignKey(p => p.PersonId);
Consulte el artículo de Asociaciones de clave extranjera unívoca para obtener más información. Por cierto, esto creará una columna de clave externa de empleado para la tabla de persona, pero no hay otra forma de tener propiedades de navegación y clave externa por separado.
Si necesita una clave foránea de solo lectura, puede cambiar la propiedad de PersonId a:
public int PersonId { get { return Person.Id; } }
Y usa tu mapeo original
HasRequired(e => e.Person)
.WithOptional(p => p.Employee)
.Map(m => m.MapKey("person_id"));
Tengo dos modelos:
public class Person
{
public virtual int Id { get; set; }
public virtual Employee Employee { get; set; } // optional
}
public class Employee
{
public virtual int Id { get; set; }
public virtual int PersonId { get; set; }
public virtual Person Person {get; set; } // required
}
public class EmployeeConfiguration : EntityTypeConfiguration<Employee>
{
public EmployeeConfiguration()
{
Property(e=>e.PersonId) // I need this property mapped
.HasColumnName("person_id")
.HasColumnType("int");
}
}
Quiero mapearlos usando mapeo fluido. La tabla de empleados tiene la columna ''person_id'' que no es anulable. Traté de seguir:
HasRequired(e => e.Person)
.WithOptional(p => p.Employee)
.Map(m => m.MapKey("person_id"));
Pero falla con:
System.Data.Entity.ModelConfiguration.ModelValidationException: Se detectaron uno o más errores de validación durante la generación del modelo:
person_id: Nombre: Cada nombre de propiedad en un tipo debe ser único. El nombre de la propiedad ''person_id'' ya está definido.
Necesito la propiedad de PersonId por sí misma, así que lo que básicamente quiero es:
HasRequired(e => e.Person)
.WithOptional(p => p.Employee)
.HasForeignKey(e => e.PersonId); // there is no such method
Pero no hay tal método aquí como HasForeignKey
En realidad, hay una mejor manera de hacer esto:
HasKey(e => e.PersonId);
HasRequired(e => e.Person)
.WithOptional(p => p.Employee);
Tenga en cuenta que ya no necesita la propiedad Employee.Id
con este enfoque, ya que era superfluo en términos de una relación de 1 a 0 o 1 en primer lugar.