5

Sono in procinto di creare uno script per un progetto abbastanza grande. Uno dei progetti richiede che un modello di Entity Framework sia compilato in una libreria. A causa del modo in cui funziona il build server, tutte le build sono realizzate a mano per gestire i vari scenari di distribuzione senza influire sugli sviluppatori e sui file di progetto.Utilizzare MSBuild per creare Entity Framework Model senza utilizzare il file di progetto?

Esiste comunque la possibilità di generare il modello EF utilizzando un'attività di MSBuild senza utilizzare il file di progetto generato da Visual Studio? Attualmente l'assembly effettivo viene compilato utilizzando un'attività CSC, tuttavia l'effettiva applicazione distribuita non riesce perché il modello EF non è incluso nell'assieme compilato.

Qualsiasi puntatore in cui è possibile utilizzare Target o Build Tasks per generare il modello e creare le risorse richieste da incorporare nell'assieme.

Nota

Il progetto compila bene in Visual Studio, ma utilizzando il file di progetto sul server di build non è un'opzione, in quanto v'è varie modifiche che devono essere apportate al progetto in fase di distribuzione e questo è controllato tramite uno script di compilazione personalizzato al di fuori del controllo dei team di sviluppo. Ciò ha funzionato con successo per alcuni progetti, tuttavia il modello EF sta causando alcuni grattacapi in questo specifico scenario.

Aggiornamento

La soluzione attuale non è ideale, ma funziona. Il file di progetto è stato modificato per copiare le risorse del modello EF in una cartella nel progetto su una nuova build di rilascio, che viene quindi verificata nel controllo del codice sorgente. Quando lo script di build viene eseguito sul server, i modelli EF vengono incorporati nell'assieme. Questo sembra essere un workaround praticabile per il momento.

risposta

4

Attualmente ho affrontato questo problema poiché l'albero dei sorgenti del mio progetto non è configurato correttamente per eseguire l'attività di build di Entity Framework che genera e incorpora le risorse nella dll di output.

ho studiato le seguenti opzioni:

Uso del msbuild compito EntityDeploy

Se si apre il file in notepad Csproj si dovrebbe vedere un po 'di XML come

<EntityDeploy Include="MyEntities.edmx"> 
    <Generator>EntityModelCodeGenerator</Generator> 
    <LastGenOutput>MyEntities.Designer.cs</LastGenOutput> 
</EntityDeploy> 

Questo è l'attività msbuild che utilizza Microsoft.Data.Entities.Build.targets e Microsoft.Data.Entities.Build.dll per leggere il file edmx, generare i file ssdl, csdl e msl e quindi incorporarli nella dll di destinazione. (Questi file possono essere trovati in C: \ Windows \ Microsoft.NET \ Framework \ v3.5).

Utilizzando EdmGen

Come Craig ha sottolineato, si potrebbe essere in grado di utilizzare EdmGen.exe fornito con il quadro. Ho dato una soluzione, ma avevo apportato un po 'di personalizzazione ai dati nel mio file edmx e EdmGen.exe sembra davvero voler fare la generazione iniziale dal database originale.

Utilizzando EdmGen2

EdmGen2.exe è un progetto open-source che fa un po 'più di EdmGen. Ho finito per usarlo per generare i file ssdl, csdl e msl. Puoi semplicemente puntarlo sul tuo file edmx e genererà i file ssdl, csdl e msl necessari. poi ho inserito questi accanto alla mia dll e modificato la stringa di connessione da

connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|res://*/MyEntities.msl; 

a

connectionString="metadata=./MyEntities.csdl|./MyEntities.ssdl|./MyEntities.msl; 

Nota sto dicendo l'Entity Framework che questi file sono nella stessa directory come il mio dll, non incorporato come risorse.

Tutti e tre questi, l'attività di compilazione, EdmGen ed EdmGen2 sono involucri sottili che chiamano System.Data.Entity.dll per tutte le cose difficili. Come ultima risorsa, si può dare un'occhiata alla dll del task build nel reflector e vedere cosa sta facendo.

Spero che questo aiuti.

1

Sì, esiste un'utilità da riga di comando denominata EdmGen che può eseguire questa operazione. Utilizzare EdmGen /? per i possibili interruttori.

Problemi correlati