2015-04-18 16 views
5

Sto utilizzando Entity Framework 6.1.1 e ho una tabella Users e una tabella User_Documents (1: molti). Avevo già una proprietà di navigazione da User_Documents a User se le cose stavano andando bene.Entity Framework che si confonde con la proprietà di navigazione

public partial class User_Document 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long User_Document_ID { get; set; } 

    public long User_ID { get; set; } 

    [ForeignKey("User_ID")] 
    public virtual User User { get; set; } 
} 

ho aggiunto una proprietà di navigazione da utenti di User_Documents

public partial class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long User_ID { get; set; } 

    [StringLength(50)] 
    public string Username { get; set; } 

    public virtual List<User_Document> Documents { get; set; } 
} 

e ora sto ricevendo un errore quando si tenta di eseguire l'applicazione:

System.Data.Entity .ModelConfiguration.ModelValidationException: Uno o sono stati rilevati più errori di convalida durante la generazione del modello:

User_Documents: Nome: ciascun nome membro in un EntityContainer deve essere univoco. Un membro con nome 'User_Documents' è già definito.

Ovviamente c'è un tavolo chiamato User_Documents ma nessun'altra proprietà con quel nome. Non sono sicuro di cosa si stia confondendo. Forse sta prendendo il nome della tabella "Utente" e il nome della proprietà "Documenti" e sta provando a creare qualcosa chiamato "User_Documents" al di fuori di esso? Se ho rinominarlo da Documents a Some_Documents come questo

public virtual List<User_Document> Some_Documents { get; set; } 

allora ottengo un altro errore che indica

System.InvalidOperationException: Il modello di sostegno nell'ambito del 'PipeTrackerContext' è cambiato da quando il database è stato creato . Considerare l'utilizzo di codice prime migrazioni per aggiornare il database

Allora corro Add-Migration e ottengo questo:

public override void Up() 
{ 
    AddColumn("dbo.User_Documents", "User_User_ID", c => c.Long()); 
    CreateIndex("dbo.User_Documents", "User_User_ID"); 
    AddForeignKey("dbo.User_Documents", "User_User_ID", "dbo.Users", "User_ID"); 
} 

Perché Sta cercando di aggiungere una nuova colonna denominata User_User_ID? Perché non posso semplicemente aggiungere la proprietà di navigazione Document come desidero?

risposta

4

uso InverseProperty Ti piace questa:

public partial class User_Document 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long User_Document_ID { get; set; } 

    public long User_ID { get; set; } 

    [ForeignKey("User_ID")] 
    [InverseProperty("Documents")] 
    public virtual User User { get; set; } 
} 

E:

public partial class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long User_ID { get; set; } 

    [StringLength(50)] 
    public string Username { get; set; } 

    [InverseProperty("User")] 
    public virtual List<User_Document> Documents { get; set; } 
} 
+0

Puoi spiegare quale problema viene risolto e come lo risolve? –

+1

questo collegamento potrebbe essere di aiuto: https://msdn.microsoft.com/en-us/data/jj591583.aspx – Iraj

0

Perché è tentando di aggiungere una nuova colonna denominata User_User_ID? Perché non riesco ad aggiungere la proprietà di navigazione del documento come preferisco a ?

Per convenzione, si creerà la chiave esterna come tablename_columnName che è User_User_ID. Ciò si verifica quando si rimuove l'attributo [ForeignKey("User_ID")] OPPURE non si dispone di una proprietà di chiave esterna.

Se si modifica il nome della proprietà Documents in qualcos'altro (come UserDocuments) non si affronta questo conflitto di nomi.

+0

Giusto, ma se rinominare Documents to UserDocuments, vuole comunque aggiungere un campo chiamato User_User_ID alla tabella Users . Perché? – d512

+0

No. L'aggiunta di User_User_ID è correlata all'attributo della chiave esterna. Hai l'attributo o lo hai rimosso? –

+0

Sembra proprio il codice che ho postato. La proprietà User nella tabella User_Documents ha l'attributo [ForeignKey] su di esso. – d512