2012-03-01 14 views
9

Desidero che il mio modello Entity Framework generi entità con internal modificatore di accesso, anziché public. Io uso il modello EF in una libreria e voglio solo una singola classe (qualche controller) per essere accessibile dall'esterno.Come rendere accessibili tutte le entità: interne invece che pubbliche in EDMX?

Esiste un modo semplice per fare in modo che la generazione del modello EF utilizzi la mod internal anziché public, inclusa la rigenerazione del modello in fase di aggiornamento?

risposta

1

È molto simile all'anwer che ho ricevuto su un similar question. Ma nel tuo caso vuoi personalizzare il modificatore di accesso delle classi, piuttosto che ObjectContext.

Adattato dopo la risposta di HVD:

Il progettista ha l'opzione "Aggiungi Generazione di codice del lotto". Se lo usi, otterrai diverse opzioni. Sto usando "ADO.NET Self-Tracking Entity Generator", ma allo stesso modo funziona per tutti loro. Scegliendo questo aggiungi due file modello (Model.tt e Model.Context.tt) al progetto, che sei libero di modificare come meglio credi. Per la modifica si sta chiedendo, troverete una generazione di codice per le classi di entità pari o vicino alla riga 37. Modifica

< # = Accessibility.ForType (entità) #> < # = code.SpaceAfter (code.AbstractOption (entità)) #> classe parziale ...

a

classe parziale ...

Per il tipo complesso, esiste una riga simile più avanti: cancella anche la parte prima di "parziale".

Questo imposterà i modificatori di accesso per tutti i tipi contemporaneamente, inclusi i tipi futuri. Per personalizzare i singoli tipi è meglio utilizzare il browser del modello.

Sarà necessario impostare la proprietà "Accesso contenitore entità" del modello stesso anche all'interno, altrimenti verranno generati membri con modificatori di accesso incompatibili.

3

, nella finestra del browser Modello selezionare> EntityTypes Certo

Model Browser

e sul tipo impostato nelle Proprietà accesso finestra modificatore. Dovresti anche modificare in EntityContainer> EntitySets il modificatore per set, come se il tipo fosse interno, l'insieme dovrebbe essere almeno interno (pubblico predefinito).

Optinally è possibile utilizzare il modello T4, in cui è possibile modificare direttamente l'accesso modificato generato.

+0

Sono a conoscenza della finestra Proprietà, ma non mi consente di selezionare più entità e impostare il loro modificatore di accesso allo stesso tempo. Devo farlo uno per uno. Credo di aver bisogno di guardare i modelli T4. –

+2

Apre il file EDMX con l'editor XML (è un semplice file XML) e sostituisce il batch lì. Fatto in 20 secondi. –

+0

Sì, stavo per trovare un'altra soluzione permanente (in cui i modificatori non sarebbero stati sostituiti dalla rigenerazione del codice), ma va bene lo stesso. –

0

Volevo che il mio contenitore dell'entità e le classi complesse generate fossero interne. Per prima cosa ho impostato "Entity Container Access" su internal. Successivamente ho aggiunto una variabile contenitore nella parte superiore del file "Model.tt" dopo l'inizializzazione della variabile itemCollection. Ho trovato il codice variabile del contenitore nel file "Model.Context.tt".

var itemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile); 
    var container = itemCollection.OfType<EntityContainer>().FirstOrDefault(); 

Poi ho cambiato

<#=Accessibility.ForType(complex)#> partial class <#=code.Escape(complex)#> 

a

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(complex)#> 

ho scelto di modificare il codice in questo modo in modo che potessi tenere i miei complessi modificatori di accesso contenitore di classe in sincronia con il contenitore modificatore di accesso.

Grazie Gert Arnold per avermi condotto nella giusta direzione.