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

2024-01-08

我使用过 EF 4.1(代码优先)不久前在一个 MVC 3 项目中,效果很好。

今天我尝试使用 EF 4.3.1 (代码优先)在一个 WinForms 项目中,遇到了一些真正的巫毒:(我正在从事的原始项目是 WinForms,但是对于attached控制台应用程序代码。)

当尝试将一个简单的类输入数据库时​​,出现以下异常:无法打开登录请求的数据库“Test”。登录失败。 用户“[计算机名]\[管理员]”登录失败。

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

NOTE: The Database does not当我第一次运行应用程序时存在。

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

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 也没有效果。

NOTE: 我注意到周围有很多类似的问题,但没有一个与我的相同and回答 - 这是我希望我能在这里幸运:)

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

EDIT:我进行了一些实验,发现了一些很奇怪的事情:

If I pause the program at the line marked "#1" and check the value of db.Database.Exists() via the Watch window, It tells me: "The function evaluation requires all threads to run" with that little wavey button I can click to make it run all threads. Image depicting the above paragraph

如果我单击该按钮,该函数的计算结果为False.

现在我可以做2 things:

  1. 继续执行:在这种情况下,我得到了完全相同的异常。
  2. 从监视窗口执行 db.Database.Create():在这种情况下,程序成功运行到最后,我看到在我的数据库中创建了数据库、表和行。SQL管理工作室.

看起来是一个简单的解决方案,对吧?错误的!

我尝试通过调用为数据访问添加前缀db.Database.CreateIfNotExists();但后来我得到了完全相同的异常在那条线上。

db.Database.Initialize(true);也没有影响...

NOTE:如果通过使用上述方法我创建了数据库,那么从那时起我就可以正确使用它,所以这至少是一半的安慰:P 当然,问题是,当我添加一个DropCreateIfModelChanges or 删除始终创建初始化程序(因为我正在积极开发模型)。

Thanks.

[我怀疑这更多是实体框架问题而不是 SQL Server 问题。]


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐