7 messaggi dal 07 febbraio 2013
Salve a tutti, ho creato un nuovo progetto ASP.NET MVC con autenticazione utenti individuale.
quando eseguo il progetto in cui uso un db sql vergine all'avvio, come mi aspettavo, vengono create tutte le tabelle Identity (users, roles, etc..)
Mi piacerebbe che fossero create in automatico anche le mie di tabelle quindi ho scritto questo codice che, se mi sono documentato bene, dovrebbe creare la mia prima tabella dalla mia classe di esempio Person.cs all'avvio dell'applicazione. Però non funziona...spero qualcuno mi possa spiegare il perché. Ecco di seguito il codice:

<Person.cs>

[Table(name:"TEST_Persone")]
public class person
{

[Key]
public int Id { get; set; }
[Required]
[Display(Name = "Nome")]
public string nome { get; set; }
[Required]
[Display(Name = "Cognome")]
public string cognome { get; set; }
public int eta { get; set; }
public string sesso { get; set; }


}

<TestContext.cs>

public class TestContext : DbContext
{
public TestContext() : base("name=DefaultConnection")
{
}

public DbSet<person> persone { get; set; }
}

<TestInitializer.cs>

public class TestInitializer : System.Data.Entity.DropCreateDatabaseAlways<TestContext>
{
protected override void Seed(TestContext context)
{
var persone = new List<person>
{
new person { cognome = "cognome1", nome="nome1", eta=20, sesso="M" },
new person { cognome = "cognome2", nome = "nome2", eta = 30, sesso = "M" }
};

persone.ForEach(s => context.persone.Add(s));
context.SaveChanges();
}


}


file Global.asax in cui dovrebbe essere eseguita l'inzializzazione della tabella.


protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
Database.SetInitializer<TestContext>(new TestInitializer());
}
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


dovrebbe creare la mia prima tabella dalla mia classe di esempio Person.cs all'avvio dell'applicazione.

Più precisamente: l'initializer creerà il database la prima volta che fai uso del DbContext (ad esempio per recuperare delle entità dal db con una query LINQ). Quindi, ad applicazione avviata, visita una delle pagine che usano il DbContext. A quel punto, se ti colleghi al db, dovresti trovare le tabelle generate.
Oppure, se la creazione non dovesse avere successo, ASP.NET dovrebbe mostrarti l'errore che si sta verificando. Per esempio, dato che hai fini di test hai configurato un DropCreateDatabaseAlways, avrai bisogno dei privilegi amministrativi per droppare e ricreare un database nella tua istanza locale di SqlServer/LocalDb. I dati che hai indicato nella connection string ti permettono di far questo?
Se ti stai collegando a LocalDb con Integrated Security=true, non dovresti avere problemi nel droppare e ricreare il db.

ciao,
Moreno

Enjoy learning and just keep making
7 messaggi dal 07 febbraio 2013
Innanzitutto Grazie 1000 Moreno per avermi risposto. Volevo solo premettere che la mia intenzione non è quella di cancellare e ricreare il database (e qui mi rendo conto di avere usato l'Initializer sbagliato) ma è quello semplicemente di creare le tabelle in Code-First "al volo" senza passare per i comandi console add-migration,etc... Meglio sarebbe eseguire un Seed riempiendo i dati per la prima volta. Una volta creata la tabella tra l'altro per le successive modifiche della struttura vorrei che i dati non vadano persi. (forse pretendo troppo???).

Ora, la tabella TEST_persone non esiste nel db e mi aspettavo che con la chiamata al controller Persone come dici tu venisse creata la tabella dalla classe che vedi nella mai precedente domnanda. Invece mi esce quest'errore...e la tabella ovviamente NON E' STAT CREATA...per quello stavo cercando si eseguire del codice di inizializzazione nel file global.asa.

HELP!!!
thanks!!!





Invalid object name 'dbo.TEST_Persone'.

Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere la traccia dello stack.

Dettagli eccezione: System.Data.SqlClient.SqlException: Invalid object name 'dbo.TEST_Persone'.

Errore nel codice sorgente:



Riga 24: return View(await db.persone.ToListAsync());
Riga 25: }
Riga 26:

File di origine: C:\web\sviluppo\api_todosMVC\api_todos\Controllers\PersoneController.cs Riga: 24

Traccia dello stack:


[SqlException (0x80131904): Invalid object name 'dbo.TEST_Persone'.]
System.Data.SqlClient.<>c.<ExecuteDbDataReaderAsync>b__174_0(Task`1 result) +867998
System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke() +77
System.Threading.Tasks.Task.Execute() +51
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
System.Data.Entity.Core.EntityClient.Internal.<ExecuteStoreCommandsAsync>d__c.MoveNext() +247
Modificato da cattamoru il 05 febbraio 2017 17.48 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


[SqlException (0x80131904): Invalid object name 'dbo.TEST_Persone'.]

Sembra che, effettivamente, l'initializer non stia facendo il suo lavoro e che la tabella TEST_Persone non esista. Hai provato ad aprire il database per vedere se è stato creato nulla lì dentro? E a mettere un breakpoint sul metodo Seed, giusto per vedere se l'esecuzione passa di lì?
E' come se l'initializer non fosse stato configurato. Come ripeto: hai i privilegi per droppare e ricreare il database con la connection string corrente?


semplicemente di creare le tabelle in Code-First "al volo" senza passare per i comandi console add-migration,etc... Meglio sarebbe eseguire un Seed riempiendo i dati per la prima volta. Una volta creata la tabella tra l'altro per le successive modifiche della struttura vorrei che i dati non vadano persi. (forse pretendo troppo???).

Tutto questo è supportato dalle EF Code First Migrations. Dovresti abiltiarle e poi configurare l'initializer MigrateDatabaseToLatestVersion. La sua configurazione di default gli impedisce di eliminare i dati. Qui c'è un tutorial:
http://www.entityframeworktutorial.net/code-first/migration-in-code-first.aspx

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.