实体框架4.3.1无法创建(/打开)数据库[​​线程异常?]

时间:2012-05-03 00:09:39

标签: c# sql-server entity-framework sql-server-2008-r2 entity-framework-4.3

我曾经在一个MVC 3项目中使用过EF 4.1( Code First ),这很好。

今天我尝试在WinForms项目中使用EF 4.3.1( Code First )并遇到一些真正的伏都教:(我正在研究的原始项目是WinForms,但同样的事情也适用于附加控制台应用程序代码。)

当尝试在数据库中输入一个简单的类时,我得到以下异常: 无法打开数据库"测试"登录请求。登录失败。 用户' [ComputerName] \ [管理员]'

登录失败

我已尝试检查SQL Server(2008 R2)配置,但我的用户 拥有服务器上的所有权限。

注意:首次运行应用程序时,数据库存在

即使以下示例代码也不起作用:

class Program
{
    public static void Main()
    {
        var person = new Person { Name = "Nathan" };
        using (var db = new MyContext())
        { //#1
            db.Persons.Add(person);
            db.SaveChanges();
        }
        Console.Write("Person saved !");
        Console.ReadLine();
    }
}

public class Person
{
    public int PersonId { get; set; }
    public string Name { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<Person> Persons { get; set; }
    public MyContext()
        : base("Data Source=localhost;Database=Test;Integrated Security=True;")
    { }
}

我尝试重新安装EF 4.3.1 - 无济于事。 重新启动SQL-Server也没有任何效果。

注意:我已经注意到了很多类似的问题,但没有一个与我的回答相同 - 这就是我希望我在这里幸运:))

澄清:拒绝访问的用户是计算机的所有者(本地管理员)。

编辑:我一直在进行一些实验,但我发现了一些非常奇怪的事情:

如果我在标有&#34;#1&#34;的行上暂停该程序并通过 Watch 窗口检查 db.Database.Exists()的值,它告诉我:&#34;功能评估要求所有线程都运行& #34; 使用那个小小的 wavey 按钮,我可以单击以使其运行所有线程。 Image depicting the above paragraph

如果我点击该按钮,该功能将评估为 False

现在我可以做 2 事情:

  1. 继续执行:在这种情况下,我会得到完全相同的例外。
  2. 从Watch窗口执行db.Database.Create():在这种情况下,程序成功运行到最后,我看到在 SQL管理中创建的数据库,表和行工作室
  3. 似乎是一个简单的解决方案,对吗?错!

    我尝试通过调用 db.Database.CreateIfNotExists(); 为数据访问添加前缀,但后来我在该行上获得完全相同的异常

    db.Database.Initialize(true); 也无效...

    注意:如果使用上面的方法创建数据库,我可以从那时起正确使用它,这样至少可以安慰一半:P问题是,当然,当我添加 DropCreateIfModelChanges DropCreateAlways Initalizer(因为我正在积极开发模型的过程中)时会发生什么。

    感谢。

    [我怀疑它比SQL Server更像是一个实体框架问题。]

1 个答案:

答案 0 :(得分:15)

如果碰巧遇到“抛出异常时中断”选项(Debug-&gt; Excptions),则可以在调试时看到此异常。 EF正在尝试连接到数据库但由于数据库尚不存在而失败,因此抛出异常。由于上面的选项已打开,您会看到异常。实际框架实际上捕获了此异常,然后EF将连接到master数据库以创建它在第一步尝试连接的数据库。创建数据库后,它将再次使用原始连接字符串与数据库进行通信。因此,您可以按F5继续调试,因为异常是第一次机会异常将被处理或禁用关闭“在抛出异常时中断”,这将导致仅针对未处理的异常而不是所有异常的异常扔了。