entity framework4.3.1无法创建(/打开)数据库

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

今天我尝试在WinForms项目中使用EF 4.3.1( Code First )并遇到一些真正的巫术:(我正在研究的原始项目是WinForms,但是对于附加的控制台应用程序代码也是如此。)

当尝试在数据库中输入一个简单的类时,我得到以下exception: 无法打开登录请求的数据库“Test”。 登录失败。 用户'[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 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()的值,它告诉我: “函数评估需要所有线程运行”,带有那个小小的波形按钮我可以单击以使其运行所有线程。 图片描绘了上面的段落

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

现在我可以做件事:

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

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

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

db.Database.Initialize(真); 没有效果……

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

谢谢。

[我怀疑它比SQL Server更像是一个entity framework问题。]

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