【问题标题】:Entity Framework 4.3.1 failing to create (/open) a database [Threading Anomaly?]Entity Framework 4.3.1 无法创建(/打开)数据库 [线程异常?]
【发布时间】:2012-05-03 00:09:38
【问题描述】:

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

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

当尝试将一个简单的类输入数据库时​​,我得到以下异常: 无法打开登录请求的数据库“测试”。登录失败。 用户“[ComputerName]\[Administrator]”登录失败。

我已尝试检查 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 也没有效果。

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

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

编辑:我一直在进行一些实验,发现一些很奇怪的东西:

如果我在标记为“#1”的行暂停程序并通过 Watch 窗口检查 db.Database.Exists() 的值,它会告诉我:“函数评估需要所有线程运行” 使用那个小wavey 按钮,我可以单击它以使其运行所有线程。

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

现在我可以做 2 件事情了:

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

似乎是一个简单的解决方案,对吧?错了!

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

db.Database.Initialize(true); 也没有效果...

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

谢谢。

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

【问题讨论】:

  • 您是否能够在没有 EF 的情况下使用您的凭据连接到数据库(例如,来自 Visual Studio 或 Sql Server Management Studio)?
  • 是的,使用 Management Studio 我可以在数据库中做任何我想做的事情,包括创建数据库、表、更新行等。
  • 您是否使用集成安全性?
  • 什么意思?在连接字符串中?
  • 很抱歉。我主要关注“登录失败”消息的行。您是否在调试时看到此异常,或者在运行应用程序时也看到它。如果这是在调试期间 - 您是否碰巧打开了“抛出异常时中断”? (您可以在 Debug->Excptions 中找到此选项)。我怀疑这种情况正在发生 - EF 正在尝试连接到数据库,但由于数据库不存在并且引发了异常(由于打开了上面的选项而导致的异常),所以它失败了。这很好,因为如果发生这种情况,EF 将捕获异常并连接到 master

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


【解决方案1】:

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

【讨论】:

  • 太好了!由于我遇到并试图找到的错误,我启用了中断,但忘记将其关闭。谢谢!
  • 我的男人!基本上我改变了我的模型,导致一个合法的异常被抛出,为 SqlException 类型打开了中断,尽管模型仍然无法创建......我所要做的就是再次关闭该异常的中断,它扔几次后就会创建模型...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多