SQLCE(開発マシンのローカル)と完全なSQL(AppHarbor)を切り替えることができるコードを作成しようとしています。 SQL CEでは、接続文字列はすべて処理されますが、SQL用に自分で接続文字列を作成する必要があります。これまでの私のコードは以下ですが、このエラーが発生します:
サポートされていないキーワード: 'metadata'
私は何時間もオンラインで探していましたが、すべてのソリューションは、見つけることができない「ContextBuilder」クラスの使用を伴います(NuGetパッケージを介してEFをインストールしました)。
現在のコードは次のとおりです(起動時に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");
}
}
EntityConnectionStringBuilderクラスを使用する必要があります
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();
}
Entity-Framework Code-Firstでは、SqlConnectionを使用します。コードファーストにはメタデータファイルがないため、EntityConnectionStringBuilderを使用できません。
コンテキストに直接設定することもできます。最初に使用するSqlServerインスタンスにmdfを添付する必要があります。エレガントではありませんが、うまくいきました
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();
}
通常どおり、EFは最初の行をコンテキストに追加するときにすべてを自動生成します。
このコードは、connection string
でEntity Framework
を作成するのに便利です。
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("\"","""));
}
一連のパラメータから次のように呼び出すことができます
GenerateEFConnectionString("srv","db","mod","vinodsrivastav","nopassword");
このようなconnection string
を生成するには
metadata=res://*/mod.csdl|res://*/mod.ssdl|res://*/mod.msl;provider=System.Data.SqlClient;provider connection string="Data Source=srv;Initial Catalog=db;User ID=vinodsrivastav;Password=nopassword;MultipleActiveResultSets=True"