Passaggio di database ad entityframework avviso di errore

martedì 24 febbraio 2015 - 17.49
Tag Elenco Tags  VB.NET

trinity Profilo | Guru

Ciao
ho aperto un nuovo progetto ed inserito un entity model da un database sql server 2014 esistente e importato sia tabella che stored procedure e funzioni.
In vs 2013 mi esce alla fine della generazione del file edmx questi due messaggi di avviso:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

e i codici sql a cui si riferiscono in ordine sono i seguenti:

CREATE PROCEDURE [dbo].[sp_salvadisp_merge] @tabmov dbo.tab_disp READONLY As BEGIN SET NOCOUNT ON; MERGE dbo.Tab_disponibilita DEST USING ( Select idstruttura, data, camdisp, camocc From @tabmov )SRC ON (SRC.idstruttura=DEST.idstruttura and SRC.data=DEST.data) WHEN MATCHED THEN Update Set camdisponibili=SRC.camdisp, camoccupate=SRC.camocc WHEN NOT MATCHED THEN Insert ( idstruttura, data, camdisponibili, camoccupate) Values ( SRC.idstruttura, SRC.data, SRC.camdisp, SRC.camocc ); END


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

come faccio a risolvere questo problema?
Cirillo Fabio
www.trycontact.com
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

0v3rCl0ck Profilo | Guru

Ciao Fabio, il problema è con i tipi di dato table var che il designer non gestisce. Io ti consiglio di importare il database esistente in Code-First, con il designer hai poco controllo, anche se è comodo perchè importa anche le stored procedure, ma esistono strumenti per importare in code-first database esistenti come http://efreversepoco.codeplex.com/

non ricordo se efreversepoco è in grado di gestire i parametri table var delle sp, ma comunque per quei casi specifici è sempre possibile crearsi l'accesso alla stored scrivendosi il metodo ad-hoc.

concludo dicendoti che il designer non esisterà più nelle versioni successive di entity framework (vedi EF7), a favore di strumenti di generazione codice partendo da un database esistente.


Michael Denny | Microsoft Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.net
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

trinity Profilo | Guru

>Ciao Fabio,
Ciao e grazie della tua risposta
il problema è con i tipi di dato table var che il
>designer non gestisce. Io ti consiglio di importare il database
>esistente in Code-First
qui non capisco come faccio ad importare il database in code-first, non devo più aggiungere nel progetto un ado.net entity model? o si?

>non ricordo se efreversepoco è in grado di gestire i parametri
>table var delle sp, ma comunque per quei casi specifici è sempre
>possibile crearsi l'accesso alla stored scrivendosi il metodo
>ad-hoc.
>
>concludo dicendoti che il designer non esisterà più nelle versioni
>successive di entity framework (vedi EF7), a favore di strumenti
>di generazione codice partendo da un database esistente.
Ok quindi per prevenire questa situazione e poi essere aggiornati ad utilizzare Ef7 come dovrei gestire ora il database?
>
>Michael Denny | Microsoft Visual C# MVP
>http://blogs.dotnethell.it/Regulator/
>http://dennymichael.net
>http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
>Twitter: @dennymic

Cirillo Fabio
www.trycontact.com
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

0v3rCl0ck Profilo | Guru

>qui non capisco come faccio ad importare il database in code-first, non devo più aggiungere nel progetto un ado.net entity model? o si?

si, puoi sempre aggiungere un "ADO.NET Entity Data Model" nel progetto, ma tieni conto che questi sono solo meri strumenti per la generazione di codice, e nel caso del designer di codice XML (che verrà completamente abbandonato a favore invece della generazione di codice .net). Per farti generare codice .net (code-first) dovrai selezionare la voce "Code First from database", se non vedi quella voce controlla di avere installato gli EF tools (che sono già inclusi in vs2013, ma non in vs2012): http://www.microsoft.com/en-us/download/details.aspx?id=40762 (http://msdn.microsoft.com/en-us/data/ee712906#tooling).

detto questo l'efreversepoco è uno strumento molto più potente di quello integrato di microsoft, ma sono fratelli, nel senso che sono semplicemente entrambi strumenti per la generazione di codice, quindi non sono librerie magiche necessarie per lavorare con entity framework, perchè infatti potresti partire direttamente dal codice per creare un database, come potresti partire direttamente dall'xml (anche se è terribile, ed è anche per questo che l'hanno abbandonato), quindi la verità è che uno strumento vale l'altro, a parità di codice che genera, semplicemente efreversepoco è più potente e sa generare più cose rispetto a quello microsoft, e rispetto a quello della microsoft code-first è in grado anche di tirarsi dentro le stored procedure.

qui trovi un bel tutorial per iniziare a creare applicazione EF Code-First partendo da un database esistente:

http://msdn.microsoft.com/en-us/data/jj200620

>Ok quindi per prevenire questa situazione e poi essere aggiornati ad utilizzare Ef7 come dovrei gestire ora il database?

Sicuramente se è un progetto nuovo, è meglio lavorare in code-first, e sarai pronto sotto più aspetti, oltre a velocizzarti il passaggio (specialmente se non vai a fare complesse personalizzazioni dell'engine come query interception), ti permetterà anche di capire bene cos'è entity e come funziona, piuttosto che legarsi ad un designer che ti nasconde tutti gli aspetti da sviluppatore, fa tante cose magiche, e spesso le fa male, o comunque prende strade inaspettate, da code-first e specialmente da EF7 tutte queste magie verranno ridimensionate e verrà dato più controllo allo sviluppatore di quello che succede nell'applicazione.

Detto questo, microsoft non ha alcuna intenzione di abbandonarci solo al codice senza avere comunque le comodità di un designer, almeno per la visualizzazione del grafo oggetti, quindi da una parte già esistono strumenti per la visualizzazione delle classi .net in un grafo a video, ma probabilmente creeranno anche strumenti ad-hoc per EF7, ma invece che creare un cavolo di xml proprietario come fanno adesso con il designer attuale (.edmx) il nuovo designer sarà progettato per materializzare puro codice .net. Stanno anche pensando per tutti quei progetti che fanno uso del vecchio designer e cioè degli .edmx, ti creare un tool di porting a wizard, per potere rimaterializzare i vecchi edmx in code-first.



Michael Denny | Microsoft Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.net
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic

trinity Profilo | Guru

Ok ho letto e pare di aver capito , comunque se importo le tabelle con codefirst e poi devo modificare una tabella o aggiungere o eliminare una nuova come devo fare dovrei ripetere ogni volta la procedura di impostazione?

poi se osservi la figura che ho inserito dopo aver caricato tutto con codefirst di microsoft per provare il file model.vb che mi si aperto mi segnala delle anomalie, (vedi l'immagine) come mai devo importare qualcosa o installare qualcosa?


1920x1080 378Kb



inoltre nel web config

la stringa di connessione è la seguente:

<add name="ReceptionContext" connectionString="data source=FABIO;initial catalog=reception;user id=sa;password=trinity;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

ma come provider mi da sqlclient invece nel mio progetto di prima con il model normale il provider era system.data.entityclient, ecco la stringa:

<connectionStrings>
<add name="receptionEntities" connectionString="metadata=res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=FABIO;initial catalog=reception;user id=sa;password=trinity;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

come mai ora con il codefirst non c'è, ho letto su questo articolo: https://msdn.microsoft.com/it-it/magazine/cc507640.aspx

che si può usare EntityClient ed io avevo già convertito tutto con entityclient nel precedente progetto

ciao
Cirillo Fabio
www.trycontact.com
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5