2013-09-04 18 views
5

Ho un programma che utilizza il database Entity Framework (EF) prima nel livello di accesso ai dati. So che, per EF per auto-generare le proprietà di navigazione di una relazione molti a molti, la tabella di mapping deve contenere solo una chiave primaria composta:Entity Framework relazione molti a molti con campo aggiuntivo (Database First)

Project 
    - ProjectId (PK) 
    - Name 

ContentType 
    - ContentTypeId (PK) 
    - Name 

ProjectContentTypeMapping 
    - ProjectId (PK) 
    - ContentTypeId (PK) 

In questo caso tutto funziona bene, e posso accedere a Progetti da ContentTypes e viceversa con le proprietà di navigazione.

Tuttavia, è necessario disporre di campi aggiuntivi specifici per la relazione tra progetti e tipi di contenuto e che sarebbero colonne aggiuntive nella tabella ProjectContentTypeMapping. Una volta aggiunti questi, perdo le proprietà di navigazione e EF mostra la tabella di mapping nel designer.

Esiste un modo per configurare manualmente la mappatura tra queste due tabelle in EF (Database First)? In alternativa, come posso rappresentarlo? Stavo pensando di avere forse un tavolo extra "metadati" con un FK alla tabella di mapping, ma sembra "hacky" per me ...

Grazie

risposta

7

No, non si può avere in più colonne la tua tabella di mappatura nel framework di entità. Perché, avendo una colonna in più implica l'intenzione di usarlo, ma le tabelle di mappatura non fanno parte dell'entità, quindi, Entity Framework, non considera più la tabella di mappatura con colonne aggiuntive come tabella di mapping. Dovrai manipolare manualmente le Mappature.

Consente di prendere ad esempio le classi:

Project 
    - ProjectId (PK) 
    - Name 
    - ProjectContents 

ContentType 
    - ContentTypeId (PK) 
    - Name 
    - ProjectContents 

ProjectContentTypeMapping 
    - ProjectId (PK) 
    - ContentTypeId (PK) 
    - OtherRelevantColumn 

dove ProjectContents è di tipo ProjectContentTypeMapping

così ogni volta che si aggiunge un progetto con una certa ContentType, si sarebbe fare questo:

Project prj = new Project(); 
//fill out scalar properties 
ProjectContentTypeMapping pctm = new ProjectContentTypeMapping(); 
pctm.ContentTypeId = 1; //or whatever you want, or selected from UI 

prj.ProjectContents = new ProjectContentTypeMapping(); 
prj.ProjectContents.Add(pctm); 

dataContext.Projects.Add(prj); 

Ora in caso di modifica (aggiunta di ContentTypes) a un progetto esistente, non lo farai prj.ProjectContents = new ... piuttosto, lo faresti solo quando è nulla i, e,

if(prj.ProjectContents==null) 
    prj.ProjectContents = new ProjectContentTypeMapping(); 

anche, una cosa molto molto importante, dal momento che ora la tua ProjectContentTypeMapping non è più una tabella di mappatura, quindi, l'eliminazione di un progetto darei un errore, se id è essere presente in ProjectContentTypeMapping tavolo; dovrai rimuoverli manualmente i.i

foreach(var pctm in prj.ProjectContents.ToList()) 
{ 
    prj.ProjectContents.Remove(pctm); 
    datacontext.ProjectContentTypeMappings.Remove(pctm); 
} 
datacontext.Remove(prj); 
datacontext.SaveChanges(); 
+0

Puoi fornire ulteriori informazioni su come manipolare manualmente i mapping? – chuwik

+0

vedere my anser @chuwik –

+3

Non è possibile avere le colonne aggiuntive ma dire a Entity Framework di trattare la tabella come se non fosse così? In qualche modo importa solo due colonne anziché l'intera tabella dal database? Ho bisogno delle colonne aggiuntive nel DB per altri motivi (politica sul posto di lavoro, altre applicazioni che utilizzano lo stesso database), ma la mia applicazione non deve nemmeno esserne a conoscenza. –

Problemi correlati