webentwicklung-frage-antwort-db.com.de

Wie kann ich die Verbindungszeichenfolge für Entity-Framework Code-First programmgesteuert festlegen?

Ich versuche, etwas Code zu schreiben, mit dem ich zwischen SQLCE (lokal auf meinem Entwicklungscomputer) und vollständiger SQL (auf AppHarbor) wechseln kann. Bei SQL CE wird die Verbindungszeichenfolge für mich behandelt, aber ich muss sie selbst für SQL erstellen. Mein bisheriger Code ist unten, jedoch gibt es diesen Fehler:

Nicht unterstütztes Keyword: "Metadaten"

Ich habe seit Stunden online gesucht, aber für alle Lösungen ist die Verwendung einer "ContextBuilder" -Klasse erforderlich, die ich nicht finden kann (ich habe EF über das NuGet-Paket installiert).

Hier ist der aktuelle Code (läuft beim Start über WebActivator):

public static void Start()
{
    // Read the details from AppSettings. Locally, these will be empty.
    var databaseHost = ConfigurationManager.AppSettings["DatabaseHost"];
    var databaseName = ConfigurationManager.AppSettings["DatabaseName"];
    var databaseUsername = ConfigurationManager.AppSettings["DatabaseUsername"];
    var databasePassword = ConfigurationManager.AppSettings["DatabasePassword"];

    // Check whether we have actual SQL Server settings.
    if (!string.IsNullOrWhiteSpace(databaseHost) && !string.IsNullOrWhiteSpace(databaseName))
    {
        // Set up connection string for a real live database :-O
        var connectionString = string.Format("metadata=res://*/DB.csdl|res://*/DB.ssdl|res://*/DB.msl;"
            + "provider=System.Data.SqlClient; provider connection string='Data Source={0};"
            + "Initial Catalog={1};User ID={2}; Password={3};MultipleActiveResultSets=True'",
            databaseHost, databaseName, databaseUsername, databasePassword);

        Database.DefaultConnectionFactory = new SqlConnectionFactory(connectionString);
    }
    else
    {
        // Set a custom database initializer for setting up dev database test data.
        Database.SetInitializer<BlogDataContext>(new BlogDataIntializer());

        // Set the connection factory for SQL Compact Edition.
        Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");
    }
}
39
Danny Tuppeny

sie sollten die Klasse EntityConnectionStringBuilder verwenden

string providerName = "System.Data.SqlClient";
string serverName = ".";
string databaseName = "AdventureWorks";

// Initialize the connection string builder for the
// underlying provider.
SqlConnectionStringBuilder sqlBuilder =
new SqlConnectionStringBuilder();

// Set the properties for the data source.
sqlBuilder.DataSource = serverName;
sqlBuilder.InitialCatalog = databaseName;
sqlBuilder.IntegratedSecurity = true;

// Build the SqlConnection connection string.
string providerString = sqlBuilder.ToString();

// Initialize the EntityConnectionStringBuilder.
EntityConnectionStringBuilder entityBuilder =
new EntityConnectionStringBuilder();

//Set the provider name.
entityBuilder.Provider = providerName;

// Set the provider-specific connection string.
entityBuilder.ProviderConnectionString = providerString;

// Set the Metadata location.
entityBuilder.Metadata = @"res://*/AdventureWorksModel.csdl|
                        res://*/AdventureWorksModel.ssdl|
                        res://*/AdventureWorksModel.msl";
Console.WriteLine(entityBuilder.ToString());

using (EntityConnection conn =
new EntityConnection(entityBuilder.ToString()))
{
conn.Open();
Console.WriteLine("Just testing the connection.");
conn.Close();
}
43
Ghyath Serhal

Verwenden Sie in Entity-Framework Code-First SqlConnection. Sie können EntityConnectionStringBuilder nicht verwenden, da in code-first keine Metadatendateien vorhanden sind.

12
rraszewski

Sie können es auch direkt in Ihrem Kontext festlegen. Sie müssen das MDF an die SqlServer-Instanz anhängen, die Sie zuerst verwenden möchten. Nicht gerade elegant, aber es hat für mich funktioniert

public void DoImportWork()
{
   var ctx = new StatisticsContext(); << your DbContext 

   ctx.Database.Connection.ConnectionString = @"Data Source=localhost\SQLEXP;AttachDbFilename=""C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXP\MSSQL\DATA\StatisticsData.mdf"";Integrated Security=True";

   ctx.Database.Connection.Open();
}

wie üblich generiert EF automatisch alles, wenn Sie die erste Zeile zum Kontext hinzufügen.

8
user2882366

Dieser Code wird zum Erstellen von connection string mit Entity Framework nützlich sein.

public string GenerateEFConnectionString(string serverName, string dbName,string ModelName,string userName,string password)
{   
    // Initialize the connection string builder for the underlying provider.
    SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
    sqlBuilder.DataSource = serverName;
    sqlBuilder.InitialCatalog = dbName;
    //sqlBuilder.IntegratedSecurity = false;
    sqlBuilder.UserID = userName;
    sqlBuilder.Password = password;
    sqlBuilder.MultipleActiveResultSets = true;

    // Initialize the EntityConnectionStringBuilder.
    EntityConnectionStringBuilder entityBuilder =
        new EntityConnectionStringBuilder();

    entityBuilder.Provider = "System.Data.SqlClient";
    entityBuilder.ProviderConnectionString = sqlBuilder.ToString();

    // Set the Metadata location.
    entityBuilder.Metadata = string.Format("res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl",ModelName); 
    return (entityBuilder.ToString().Replace("\"","&quot;"));
}

Es kann aus einer Reihe von Parametern als aufgerufen werden 

GenerateEFConnectionString("srv","db","mod","vinodsrivastav","nopassword");

einen connection string so zu generieren 

metadata=res://*/mod.csdl|res://*/mod.ssdl|res://*/mod.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=srv;Initial Catalog=db;User ID=vinodsrivastav;Password=nopassword;MultipleActiveResultSets=True&quot;
0
Vinod Srivastav