c# poco entity-framework-4.1

c# - Entity Framework 4.1 Código Primero identificador de clave externa



poco entity-framework-4.1 (3)

Tengo dos entidades referenciadas una a muchas. Cuando el framework de entidades creó la tabla, crea dos claves externas, una para la clave que he especificado con la interfaz fluida y la otra para la recopilación de IC. ¿Cómo me deshago de la clave externa duplicada?

public class Person { public long RecordId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } public string Username { get; set; } public long DepartmentId { get; set; } public virtual Department Department { get; set; } } public class Department { public long RecordId { get; set; } public string Name { get; set; } public virtual ICollection<Person> People { get; set; } } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Person>() .HasRequired(p => p.Department) .WithMany() .HasForeignKey(p => p.DepartmentId) .WillCascadeOnDelete(false); }

¡Gracias!


Debe especificar el extremo múltiple de la asociación explícitamente:

modelBuilder.Entity<Person>() .HasRequired(p => p.Department) .WithMany(d => d.People) .HasForeignKey(p => p.DepartmentId) .WillCascadeOnDelete(false);

De lo contrario, EF asumirá que hay dos asociaciones: una que no está expuesta en el Department con la clave externa DepartmentId y el DepartmentId propiedad de navegación en la clase Person como lo definió en el Código Fluent - y otra asociación que pertenece a la propiedad de navegación expuesta People pero con otro extremo no expuesto en Person y una clave externa creada automáticamente por EF. Esa es la otra clave que ves en la base de datos.


Las convenciones predeterminadas de Code First detectan la clave externa de su DepartmentId, ya que es, bueno, convencional. Creo que deberías eliminar la definición Fluent:

modelBuilder.Entity<Person>() .HasRequired(p => p.Department) .WithMany() .WillCascadeOnDelete(false);


Lo mejor es eliminar la propiedad departmentid de la clase Person y agregar la siguiente declaración. MapKey creará una columna de clave externa con el nombre que especifique

modelBuilder.Entity<Person>().HasRequired(p => p.Department) .WithMany().Map(x=>x.MapKey("DepartmentId")) .WillCascadeOnDelete(false);