2012-06-06 19 views
12

Recentemente mi sono imbattuto in questo strano problema con Entity Framework Code First.Perché sto ottenendo una colonna chiave esterna aggiuntiva con il codice Entity Framework Attributi chiave esterna prima?

La mia classe assomiglia a questo

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; } 
} 

La mia classe gli si presenta così

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; } 
    } 

E per qualsiasi motivo la tabella del database che viene creato ha le seguenti colonne

StatusID 
Name 
MemberID 
PosterID 
Member_MemberID 

con MemberID, PosterID e Member_MemberID sono chiavi esterne.

Come posso evitare di generare Member_MemberID?

+1

Quante proprietà di navigazione da 'Membro' a' Stato' hai? Mostra la tua classe 'Member'. –

+0

Lotti! Ho aggiunto nella classe membro alla domanda. –

risposta

8

La colonna Member_MemberID viene creata a causa della proprietà Member.Statuses. Posso immaginare che questo non è quello che vuoi. Probabilmente i membri e gli stati dovrebbero esistere indipendentemente l'uno dall'altro, quindi è necessaria una tabella di giunzione.

Non so se si utilizza già la OnModelCreating override della DbContext, ma questo è il posto giusto per cambiare la mappatura tra gli Stati e Stato:

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

Questo creerà una tabella MemberStatuses tavolo con i due Colonne Id come chiavi esterne. Questo è un modo per modellare una relazione molti-a-molti senza una proprietà di navigazione sul lato "altro" dell'associazione. (Non penso che tu voglia una proprietà Members in Status).

+3

Un'altra spiegazione qui sarebbe buona. Non capisco davvero perché una relazione 2-a-molti debba causare la creazione della colonna 'Member_MemberID'. Perché è necessario? – Jez

+1

@Jez Hai ragione, potrebbe essere spiegato un po 'meglio. Il campo 'Member_MemberID' è lo stato FK per la relazione uno-a-molti Stati membri.Viene creato perché l'associazione non è vista come la parte bidirezionale di 'Member' o' Poster'. Il punto della mia soluzione era che (imo) i membri e gli stati sono entità abbastanza indipendenti, non aggregate come la linea d'ordine. –

+0

Ho davvero problemi a capire quello che stai dicendo, @GertArnold. Cos'è "l'associazione"? Cos'è la "parte bidirezionale"? – Jez

0

L'ho visto prima. Nel mio caso (Usando EF 6.1), è stato perché il mio mappatura API perfetto stato istituito in questo modo:

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

Questo codice funziona perfettamente bene, ma non dice EF che la mia Member della classe Collection navigazione Proprietà Status è stato preso in considerazione. Quindi, mentre gestivo esplicitamente l'esistenza di una proprietà di navigazione Member nella mia classe Status, ora lasciavo una proprietà di raccolta correlata orfana. Quella proprietà orfana, essendo una raccolta, dice a EF che la mia classe Status deve avere una chiave esterna. Quindi lo crea nella classe Status.

Per risolvere il problema, ho dovuto essere esplicito al 100%.

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

Potrebbe ape che la vostra proprietà Statuses Collezione in Member ha bisogno di un attributo dicendogli che è già considerato, e di non andare mappature di auto-creazione. Non conosco questo attributo.

Problemi correlati