为EF代码第一个程序生成连接字符串

时间:2015-10-17 08:18:35

标签: c# entity-framework connection-string

我使用EF的代码优先方法。当程序第一次启动时,需要从用户输入生成连接字符串。

这是检查它是否可以立即连接的简单方法我试图获取一些数据因为碰巧在测试期间可以打开/关闭连接但是获取任何数据都会引发异常:

public static bool IsConnectionValid(string connectionString)
    {
        if (string.IsNullOrWhiteSpace(connectionString)) return false;
        using (var context = new HolidayCalendarContext(connectionString))
        {
            try
            {
                context.Database.Connection.Open();
                var contex = context.Employees.ToList();
                context.Database.Connection.Close();
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }
    }

现在我在这里生成连接字符串,UserName和Password是可选的,密码可以在以后作为参数提供:

private string GenerateConnectionString()
    {
        var builder = new SqlConnectionStringBuilder
        {
            DataSource = Source,
            InitialCatalog = Catalog,
            IntegratedSecurity = true,
            ConnectTimeout = CONNECTION_TIMEOUT
        };

        if (!string.IsNullOrWhiteSpace(UserName))
        {
            builder.UserID = UserName;
        }
        if (!string.IsNullOrWhiteSpace(Password))
        {
            builder.Password = Password;
        }
        return builder.ToString();
    }

我测试的方法是绑定到"登录到db"按钮。 SaveConnection只是在配置文件中存储正确的连接字符串,而ChangeUtility就是此时无关的导航内容。

private void LoginToDatabaseExecute(object obj)
    {
        if (ValidateInput())
        {
            var connectionString = GenerateConnectionString();
            if (TestConnection(connectionString))
            {
                SaveConnection(connectionString);
                ChangeUtility(new LoginViewModel(MainViewModel));
            }
        }
    }

因此,我已经通过测试生成了这些字符串,测试通过了。通过调试器检查,它连接并正确获取Employees:

[TestMethod]
    public void SuccessfulConnectionStoresConnectionStringInSettings()
    {
        SetCorrectConnectionString();

        _viewModel.LoginToDatabaseCommand.Execute(null);

        var connectionString = SettingsHelper.GetConnectionString();

        Assert.IsFalse(string.IsNullOrWhiteSpace(connectionString));
    }

private void SetCorrectConnectionString()
    {
        _viewModel.Source = "YOGER\\SQLEXPRESS";
        _viewModel.Catalog = "HolidayCalendar";
        _viewModel.UserName = "";
        _viewModel.Password = "";
    }

这就是问题所在。测试通过后,我启动了程序,设置了相同的输入,从测试"Data Source=YOGER\\SQLEXPRESS; Initial Catalog=HolidayCalendar; Integrated Security=True; Connect Timeout=5"得到相同的连接字符串,但在IsConnectionValid尝试打开它时连接失败,抛出{{1} }

"Keyword not supported: 'initial catalog'." System.ArgumentException

我已经尝试了Exception thrown: 'System.ArgumentException' in System.Data.SqlServerCe.dll Exception thrown: 'System.ArgumentException' in System.Data.dll ,但它需要元数据,我发现代码首先没有,所以我无法让它工作。

2 个答案:

答案 0 :(得分:1)

您正在尝试连接到SQL Express,但是从SqlServerCe.dll抛出了异常。它表示您的程序使用SQL CE提供程序。

我会检查app.config`文件中的entityFramework.defaultConnectionFactory部分。对于SQL Express,应将其设置为

<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">

答案 1 :(得分:0)

抛出异常:

  

&#39; System.ArgumentException&#39;在System.Data.SqlServerCe.dll

抛出异常:

  

&#39; System.ArgumentException&#39;在System.Data.dll

表示直到你指出SQL Server CE数据库而不是SQL Server Express