2011-04-13 22 views
18

Tengo dos entidades referenciadas de una a varias. Cuando el marco de la entidad creó la tabla, crea dos claves externas, una para la clave que he especificado con la interfaz fluida y la otra para ICollection. ¿Cómo me deshago de la clave externa duplicada?Entity Framework 4.1 Código First Foreign Key Id's

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!

Respuesta

25

debe especificar el fin de muchos de la asociación explícita:

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

lo contrario de EF se asume que hay dos asociaciones: Uno que no está expuesta en Department con la clave externa DepartmentId y la propiedad de navegación Department en la clase Person como ha definido 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.

+0

¿Podría funcionar esto ??? : [ForeignKey ("Department")] public long DepartmentId {get; conjunto; } – billy

+0

@billy: No es 100% lo mismo porque las anotaciones no desactivan la eliminación en cascada. Si no desea deshabilitar la eliminación en cascada, entonces funciona, sí. Pero incluso no necesita las anotaciones porque las convenciones de nomenclatura detectarán la propiedad clave externa de forma automática. – Slauma

+0

Súper, ¡Gracias! – billy

6

Las convenciones predeterminadas de Code First detectan su clave foránea DepartmentId, ya que es, bueno, convencional. Creo que se debe eliminar la definición Fluido:

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

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); 
+0

Intenté este enfoque, pero provocó una excepción cuando se ejecutaba el método 'Seed()', haciendo referencia al nombre de columna predeterminado y no al especificado en 'MapKey()'. –

Cuestiones relacionadas