2012-06-06 6 views
12

Recientemente me encontré con este extraño problema con la entidad Código Marco primer lugar.¿Por qué obtengo una columna de clave externa adicional con los primeros atributos clave extranjeros del Código de Entidad?

Mi clase tiene este aspecto

public class Status 
{ 
     [Key] 
     public int StatusID { get; set; }  
     public string Name { get; set; } 
     public int MemberID { get; set; } 

     [ForeignKey("MemberID")] 
     public virtual Member Member { get; set; }     

     public int PosterID { get; set; } 

     [ForeignKey("PosterID")] 
     public virtual Member Poster { get; set; }   

     public virtual ICollection<StatusLike> StatusLikes { get; set; }   
     public virtual ICollection<StatusComment> StatusComments { get; set; } 
} 

Mi clase miembro tiene este aspecto

public class Member 
    { 
     [Key] 
     public int MemberID { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Bio { get; set; } 

     public virtual ICollection<MemberCourseTaken> MemberCourseTakens { get; set; } 
     public virtual ICollection<Status> Statuses { get; set; } 
     public virtual ICollection<Club> FoundedClubs { get; set; } 

     public string EmailAddress { get; set; } 
     public string Password { get; set; } 
     public string Phone { get; set; } 

     public int AccountSourceID { get; set; } 
     public AccountSource AccountSource { get; set; } 

     public int AddressID { get; set; } 
     public Address Address { get; set; } 
     public string ProfilePhoto { get; set; } 

     public int MemberRankID { get; set; } 
     public MemberRank MemberRank { get; set; } 
     public DateTime Created { get; set; } 
     public DateTime Modified { get; set; } 
    } 

Y por alguna razón la tabla de base de datos que se crea tiene las siguientes columnas

StatusID 
Name 
MemberID 
PosterID 
Member_MemberID 

con MemberID, PosterID y Member_MemberID siendo claves foráneas.

¿Cómo se puede mantener a lo Member_MemberID que se genere?

+1

¿Cuántas propiedades de navegación tiene de 'Miembro' a 'Estado'? Muestra tu clase 'Member'. –

+0

¡Montones! Agregué en la clase de miembro a la pregunta. –

Respuesta

8

Su columna Member_MemberID se crea debido a la propiedad Member.Statuses. Puedo imaginar que esto no es lo que quieres. Probablemente, los miembros y los estados deberían existir independientemente el uno del otro, por lo que necesita una tabla de unión.

No sé si ya utiliza el OnModelCreating anulación de la DbContext, pero eso es el lugar para cambiar la asignación entre los miembros y Estado:

protected override void OnModelCreating(DbModelBuilder mb) 
{ 
    mb.Entity<Member>().HasMany(m => m.Statuses).WithMany(); 
} 

Esto creará una mesa MemberStatuses mesa con los dos Id columnas como claves foráneas. Esta es una manera de modelar una relación de muchos a muchos sin una propiedad de navegación en el lado "otro" de la asociación. (No creo que quiera una propiedad Members en Status).

+3

Algunas explicaciones más aquí serían buenas. Realmente no entiendo por qué una relación de 2 a muchos debería provocar la creación de la columna 'Member_MemberID'. ¿Por qué es necesario? – Jez

+1

@Jez Tienes razón, podría explicarse un poco mejor. El campo 'Member_MemberID' es el estado de FK to para la relación de uno a muchos Member-Status.Se crea porque la asociación no se ve como la parte bidireccional de 'Miembro' o 'Cartel'. El objetivo de mi solución fue que los (imo) miembros y estados son entidades bastante independientes, no agregadas como order-orderline. –

+0

Realmente estoy teniendo problemas para entender lo que dices, @GertArnold. ¿Qué es "la asociación"? ¿Qué es "la parte bidireccional"? – Jez

0

que he visto esto antes. En mi caso (El uso de EF 6.1), fue porque mi Mapeo API Fluido se estableció de esta manera:

// In my EntityTypeConfiguration<Status> 
HasRequired(x => x.Member).WithMany().HasForeignKey(x => x.MemberID); 

Ese código funciona perfectamente bien, pero no le dice a EF que mi Member de Colección de navegación Propiedad Status clase ha sido tomado en cuenta. Así, mientras que manejé explícitamente la existencia de una propiedad de navegación Member en mi clase Status, ahora dejó una propiedad de colección relacionados con huérfanos. Esa propiedad huérfana, al ser una colección, le dice a EF que mi clase Status debe tener una clave externa. Por lo tanto, crea eso en la clase Status.

Para arreglarlo, tenía que ser 100% explícito.

HasRequired(x => x.Member).WithMany(x => x.Statuses).HasForeignKey(x => x.MemberID) 

Podría abeja que su Statuses propiedad de colección en Member necesita un atributo diciéndole que ya se considera, y no ir asignaciones de auto-creación. No conozco ese atributo.

Cuestiones relacionadas