不久前,我在 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()的值,它会告诉我:“函数评估需要所有线程都运行”用那个小波浪按钮我可以点击使其运行所有线程。
如果我单击该按钮,则该函数的计算结果为False。
现在我可以做两件事:
- 继续执行:在这种情况下,我得到完全相同的异常。
- 从 Watch 窗口执行 db.Database.Create():在这种情况下,程序成功运行到最后,我看到在我的SQL Management Studio中创建的数据库、表和行。
似乎是一个简单的解决方案,对吧?错误的!
我尝试通过调用db.Database.CreateIfNotExists(); 来为数据访问添加前缀;但后来我在那条线上得到了完全相同的例外。
db.Database.Initialize(true); 也没有效果...
注意:如果通过使用上述方法创建数据库,我可以从那时起正确使用它,所以这至少是一半的安慰:P 当然,当我添加DropCreateIfModelChanges或DropCreateAlways Initalizer 时会发生什么(因为我正在积极开发模型)。
谢谢。
[我怀疑它更多的是实体框架问题而不是 SQL Server。]