我如何编程设置为实体框架code-首先连接字符串? [英] How do I programmatically set the connection string for Entity-Framework Code-First?

查看:180
本文介绍了我如何编程设置为实体框架code-首先连接字符串?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试着写一些code,让我SQLCE(我的本地dev的机器)和完整的SQL(上AppHarbor)之间切换。使用SQL CE,连接字符串为我所有处理,但我必须构建它自己的SQL。我的code,到目前为止低于,但它给这个错误:


  

不支持关键字:元数据


我一直在寻找在线小时,但所有的解决方案涉及使用中,ContextBuilder类,我找不到(我已经通过的NuGet包安装EF)。

下面是目前的code(通过WebActivator启动时运行):

 公共静态无效的开始()
{
    //读取从AppSettings的细节。在当地,这些都将是空的。
    VAR databaseHost = ConfigurationManager.AppSettings [DatabaseHost];
    VAR的databaseName = ConfigurationManager.AppSettings [数据库名];
    VAR databaseUsername = ConfigurationManager.AppSettings [DatabaseUsername];
    VAR databasePassword = ConfigurationManager.AppSettings [DatabasePassword]​​;    //检查我们是否有实际的SQL Server设置。
    如果(string.IsNullOrWhiteSpace(databaseHost)及!&安培;!string.IsNullOrWhiteSpace(的databaseName))
    {
        //设置连接字符串一个活生生的数据库:-O
        VAR的connectionString =的String.Format(元= RES://*/DB.csdl |高分辨率://*/DB.ssdl |高分辨率://*/DB.msl;
            +提供程序= System.Data.SqlClient的;提供连接字符串='数据源= {0};
            +初始目录= {1};用户ID = {2};密码= {3}; MultipleActiveResultSets = TRUE'
            databaseHost,的databaseName,databaseUsername,databasePassword);        Database.DefaultConnectionFactory =新SqlConnectionFactory(的connectionString);
    }
    其他
    {
        //设置自定义数据库初始化设立dev的数据库的测试数据。
        Database.SetInitializer&所述; BlogDataContext>(新BlogDataIntializer());        //设置SQL精简版的连接工厂。
        Database.DefaultConnectionFactory =新SqlCeConnectionFactory(System.Data.SqlServerCe.4.0);
    }
}


解决方案

您应该使用 EntityConnectionStringBuilder

 字符串的providerName =System.Data.SqlClient的;
字符串SERVERNAME =。
字符串的databaseName =AdventureWorks的;//初始化的连接字符串生成器
//基础提供。
SqlConnectionStringBuilder sqlBuilder =
新SqlConnectionStringBuilder();//设置数据源的属性。
sqlBuilder.DataSource =服务器;
sqlBuilder.InitialCatalog =的databaseName;
sqlBuilder.IntegratedSecurity = TRUE;//构建SqlConnection的连接字符串。
字符串providerString = sqlBuilder.ToString();//初始化EntityConnectionStringBuilder。
EntityConnectionStringBuilder entityBuilder =
新EntityConnectionStringBuilder();//设置提供程序名称。
entityBuilder.Provider =的providerName;//设置特定的连接字符串。
entityBuilder.ProviderConnectionString = providerString;//设置位置元数据。
entityBuilder.Metadata = @RES://*/AdventureWorksModel.csdl |
                        RES://*/AdventureWorksModel.ssd​​l |
                        RES://*/AdventureWorksModel.msl
Console.WriteLine(entityBuilder.ToString());使用(EntityConnection康恩=
新的EntityConnection(entityBuilder.ToString()))
{
conn.Open();
Console.WriteLine(只是测试连接。);
conn.Close();
}

I'm trying to write some code that allows me to switch between SQLCE (locally on my dev machine) and full SQL (on AppHarbor). With SQL CE, the connection string is all handled for me, but I have to construct it myself for SQL. My code so far is below, however it gives this error:

Keyword not supported: 'metadata'

I've been looking online for hours, but all the solutions involve using a "ContextBuilder" class which I can't find (I've installed EF via the NuGet package).

Here's the current code (running at startup via 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");
    }
}

解决方案

you should use the EntityConnectionStringBuilder class

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();
}

这篇关于我如何编程设置为实体框架code-首先连接字符串?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆