19 messaggi dal 09 ottobre 2013
Salve sto sviluppando un sito web in aspnet WebForms con VS2010 (Ho installato EF 6) e volevo utilizzare Linq to Entities Code First,però NON riesco a far creare il Database (con una sola tabella "News") per la prima volta in seguito ad un inserimento di valori da me inseriti.Nella stringa di connessione nel Web.config faccio riferimento a SQLExpress2008 :

<connectionStrings>
<add name="Connection"
providerName="System.Data.SqlClient"
connectionString="Server=.\SQLEXPRESS2008;Database=MioDatabase;Integrated Security=True;"/>
</connectionStrings>



Mentre questo è quanto messo nel Context:

namespace Progetto.Data
{
public class ProgettoContext : DbContext
{
public ProgettoContext()
{
this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;
//Database.SetInitializer(new ProgettoInitializer());
Database.SetInitializer(new DropCreateDatabaseAlways<ProgettoContext>());

this.Configuration.LazyLoadingEnabled = false;
Database.SetInitializer<ProgettoContext>(null);
}

public DbSet<New> News { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//dynamically load all configuration
System.Type configType = typeof(NewMap); //any of your configuration classes here
var typesToRegister = Assembly.GetAssembly(configType).GetTypes()
.Where(type => !String.IsNullOrEmpty(type.Namespace))
.Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
foreach (var type in typesToRegister)
{
dynamic configurationInstance = Activator.CreateInstance(type);
modelBuilder.Configurations.Add(configurationInstance);
}

base.OnModelCreating(modelBuilder);
}
}
}

Naturalmente ho creato anche le classi necessarie,ma non riesco a creare il DB.
Potete darmi una mano?... Anche perchè non ho molta esperienza a riguardo.
Grazie mille in anticipo
ciao
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
nel costruttore di ProgettoContext vedo che assegni per due volte un initializer. Nella seconda (che è quella che "vince") imposti l'initializer a null e quindi - dato che nessun initializer è stato di fatto impostato - è normale che il db non venga creato.

Dovresti spostare l'istruzione Database.SetInitializer nel metodo Application_Start del Global.asax, oppure all'interno del costruttore statico della classe ProgettoContext. In questo modo ti assicuri che venga settato una e una sola volta nel ciclo di vita dell'applicazione.

Prova così, con un costruttore statico. Ho sfoltito anche il costruttore "normale".
static ProgettoContext(){
  Database.SetInitializer(new DropCreateDatabaseAlways<ProgettoContext>());
}
public ProgettoContext() : base("name=Connection")
{
  this.Configuration.LazyLoadingEnabled = false;
}


ciao,
Moreno
Modificato da BrightSoul il 20 maggio 2015 22.54 -

Enjoy learning and just keep making
19 messaggi dal 09 ottobre 2013
Ciao e grazie per la risposta,ho seguito il tuo consiglio mettendo questo in ProgettoContext ma ancora il DB non si crea:

namespace Progetto
{
public class ProgettoContext : DbContext
{

static ProgettoContext()
{
Database.SetInitializer(new DropCreateDatabaseAlways<ProgettoContext>());
}

public ProgettoContext() : base("Connection")
{
this.Configuration.LazyLoadingEnabled = false;
}

public DbSet<New> News { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
System.Type configType = typeof(NewMap);
var typesToRegister = Assembly.GetAssembly(configType).GetTypes()
.Where(type => !String.IsNullOrEmpty(type.Namespace))
.Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
foreach (var type in typesToRegister)
{
dynamic configurationInstance = Activator.CreateInstance(type);
modelBuilder.Configurations.Add(configurationInstance);
}

base.OnModelCreating(modelBuilder);
}
}
}

Magari sbaglio qualcosa nella pagina in cui inserisco i dati?Ecco il codice della pagina che mi consente di inserire dei valori di prova nel DB:

namespace Progetto
{
public partial class Notizie : System.Web.UI.Page
{
protected void Button_Click(object sender, EventArgs e)
{
try{
if (TextBox_Titolo.Text != "" && TextBox_Contenuto.Text != " " && TextBox_Data.Text != string.Empty)
{
New notizia = new New() { Titolo = TextBox_Titolo.Text, Contenuto = TextBox_Contenuto.Text, Data = DateTime.Parse(TextBox_Data.Text) };
string script1 = "alert(\"Ok!\");";
ScriptManager.RegisterStartupScript(this, GetType(), "ServerControlScript", script1, true);
}
else
{
string script2 = "alert(\"Devi inserire tutti i campi!\");";
ScriptManager.RegisterStartupScript(this, GetType(), "ServerControlScript", script2, true);
}
}
catch (Exception ex)
{
string script3 = "alert(\"Errore di inserimento!\");";
ScriptManager.RegisterStartupScript(this, GetType(), "ServerControlScript", script3, true);
}
}

protected void Calendar_SelectionChanged(object sender, EventArgs e)
{
DateTime data;
data = Calendar.SelectedDate;
TextBox_Data.Text = data.ToString("dd/MM/yyyy");
}
}
}

Spero potrai aiutarmi.
Grazie e ciao
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

Correggi qui:
: base("Connection")

Prova a scrivere:
: base("name=Connection")


In più, posta la connection string chiamata "Connection" che hai nel web.config. Ho come l'impressione che il db in realtà venga creato, ma non dove tu ti aspetti.

Che cosa succede quando avvii la pagina, hai degli errori?

ciao,
Moreno

Enjoy learning and just keep making
19 messaggi dal 09 ottobre 2013
Ciao, non ho errori quando avvio la pagina,questa è la connection string:

<connectionStrings>
<add name="Connection"
providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS2008;Database=MioDatabase;Integrated Security=True;"/>
</connectionStrings>

Oppure avevo anche provato questa in alternativa:

<!--<connectionStrings>
<add name="Connection"
connectionString="Data Source=.\SQLEXPRESS2008;InitialCatalog=MioDatabase;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
</connectionStrings>-->

Credo debba crearlo in SqlExpress2008 giusto?
Ti riporto per chiarezza anche tutto il WebConfig:

<?xml version="1.0" encoding="utf-8"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
</configSections>
<connectionStrings>
<add name="Connection"
providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS2008;Database=MioDatabase;Integrated Security=True;"/>
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<authentication mode="Forms">
<forms loginUrl="~/Account/Login.aspx" timeout="2880" />
</authentication>
<membership>
<providers>
<clear />
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
</providers>
</membership>
<profile>
<providers>
<clear />
<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" />
</providers>
</profile>
<roleManager enabled="false">
<providers>
<clear />
<add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
<add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
</providers>
</roleManager>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
</configuration>


Ciao e grazie ancora
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,


Credo debba crearlo in SqlExpress2008 giusto?

Esatto, nell'istanza locale che si chiama SqlExpress2008. Hai provato a collegarti a quell'istanza dal Sql Server Management Studio (o da Visual Studio 2013, con l'Esplora Oggetti di Sql Server) e a verificare se il db è stato creato oppure no?

Considera che il db viene creato quando istanzi il ProgettoContext per la prima volta e cominci ad usarlo per fare delle query. (Non all'avvio dell'applicazione).

Nel tuo codice non vedo il punto in cui crei un'istanza del ProgettoContext. Prova ad usarlo per aggiungere degli oggetti e persisterli nel db con il suo metodo SaveChanges(). Vedi che succede. Dovrebbe crearti il db o darti un errore.


Oppure avevo anche provato questa in alternativa:

Come leggi qui, entrambe dovrebbero funzionare ugualmente bene. Initial Catalog ha uno spazio tra le parole.

ciao,
Moreno

Enjoy learning and just keep making
19 messaggi dal 09 ottobre 2013
Ciao,avevi ragione mancava il SaveChanges(), ora il DB si crea correttamente !,grazie mille per avermi aiutato !!
ciao

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.