Domanda

Sto tentando di distribuire la mia app in un ambiente di test, ma non riesco a far funzionare correttamente Entity Framework con il database. In fase di sviluppo, utilizzo un inizializzatore di database per eseguire il seeding del database e ha funzionato perfettamente. Tuttavia, quando distribuisco l'applicazione su un'istanza IIS effettiva, non riesco a farla interfacciare con il database. Le mie regole di inizializzazione personalizzate non vengono eseguite affatto, quindi sto invece creando il database manualmente.

Ho utilizzato ObjectContext.CreateDatabaseScript () come punto di partenza per il mio script SQL e SSMS verifica che due righe siano popolate nella tabella appropriata.

Il mio problema sorge dopo aver eseguito l'applicazione. Ho l'appartenenza personalizzata e i provider di ruoli, nessuno dei quali sembra rilevare che i due ruoli esistono nel database.

Come faccio a far sì che il mio entity framework riconosca che queste righe non sono vuote? Attualmente sto utilizzando un DbContext privato all'interno di un repository per gestire la comunicazione con Entity Framework e ho disabilitato il mio inizializzatore personalizzato fino a quando questo inconveniente non viene risolto.

Codice che tenta di trovare i ruoli nel database:

context.Roles.Single(r => r.Name == role)

Il database mostra quanto segue nella tabella Ruoli:

Id  Name     Description
1   Company  NULL
2   Customer NULL

LINQ genera un'eccezione di sequenza vuota, poiché context.Roles è vuoto.

È stato utile?

Soluzione 2

Ecco i passaggi che ho seguito per migrare da un progetto code first con un'implementazione IDatabaseInitializer personalizzata che reimposta il database durante ogni sessione a una configurazione DB non volatile.

Innanzitutto, copia lo schema generato da Entity Framework nel tuo dev. progetto eseguendo il codice seguente e posizionando l'output in una posizione accessibile (ad esempio: file sul desktop, testo grezzo nel browser, ecc.). Il contesto è un'istanza della tua classe che eredita da DbContext :

((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript()

In secondo luogo, salva la stringa restituita da quella chiamata in un file SQL. Assicurati di rimuovere il comando che crea la tabella dei metadati di Entity Framework. Questo comando dovrebbe essere simile al seguente:

create table [dbo].[EdmMetadata] 
( 
    [Id] [int] not null identity, 
    [ModelHash] [nvarchar](max) null, 
    primary key ([Id]) 
);

Successivamente, rimuovi il codice che semi il database. Ho utilizzato AppSetting in modo da poter facilmente attivare o disattivare l'utilizzo di quel codice dopo la distribuzione senza dover ricompilare e distribuire.

if (ConfigurationManager.AppSettings["Mode"] == "Dev")
{
    Database.SetInitializer<PonosContext>(new PonosInitializer());
    new MyContext().Database.Initialize(true);
}

Immediatamente al di fuori di tale istruzione, è comunque necessario inizializzare il database, ma assicurati di passare false in modo che l'inizializzazione avvenga solo se il database non è stato inizializzato.

new MyContext().Database.Initialize(false);

Infine, esegui il tuo setup SQL su un database vuoto per creare le tabelle con i campi appropriati.

Se distribuisci e poi esegui la tua applicazione, dovrebbe connettersi al database ed essere in grado di funzionare normalmente con qualsiasi dato caricato in uno script esterno. Ho testato questo metodo con successo con l'appartenenza personalizzata e i provider di ruoli.

Altri suggerimenti

A giudicare dai commenti sembra che non vi sia alcuna connessione tra Entity Framework e il database.Non dici quale versione di Entity Framework stai utilizzando, ma presumo che tu abbia aggiornato all'ultima (4.3 al momento della scrittura).

Ho notato che dici che stai "creando il database manualmente".Perché non aprire un progetto di prova e creare un nuovo primo modello di database basato sul database creato manualmente?Questo dovrebbe almeno confermare che puoi usare Entity Framework con la tua configurazione. Da lì creerei un altro progetto da zero per testare l'approccio Code First.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top