Entity Framework Code First DbContext 在编译期间检查 ConnectionString 吗?

5

看起来Code First DbContext在编译期间确实使用了给定的ConnectionString?我甚至不知道这是如何可能的,但对我来说似乎是这样的。如果我关闭本地SQL Server,我会收到错误提示“无法获取DbContext类型的MetadataWorkspace...”。打开SQL Server后,一切都可以正常编译。

这是我的上下文的一部分(我正在使用现有的数据库,是的,我知道,实际上并不是Code First)

public class MyContext : DbContext
{
    public MyContext() : base("MY_DYNAMIC_CONNECTIONSTRING")
    {
        Database.SetInitializer<MyContext>(null);
    }
    ...

如果真的是这样,那么就存在一个巨大的问题。我该如何防止它这样做呢?如果我使用的是不同的构建机器,连接字符串无法正常工作怎么办?或者是我做错了什么?请问有什么建议吗?

1
这是在WCF RIA服务项目中吗?我只看到在RIA服务+EF4.1的上下文中提到了这个错误。我认为它不会发生在“纯粹”的EF 4.1项目中。我刚刚关闭了我的SQL Server,但我仍然可以编译一个EF 4.1控制台项目。尽管如此,我也很想知道发生了什么。 - Slauma
2个回答

6
WCF RIA Services在设计时和编译时实例化DbContext,而不仅仅是在运行时实例化。引用来自http://jeffhandley.com/archive/2011/06/30/RIAServicesCodeFirst.aspx的一句话:
“为了将代码生成到您的Silverlight项目中,RIA服务必须在构建时检查您的DbContext以获取可用的实体类型。”
引用来自http://varunpuranik.wordpress.com/2011/06/29/wcf-ria-services-support-for-ef-4-1-and-ef-code-first/#comment-102的一句话:
“EF CodeFirst独立使用和与RIA服务使用的区别在于我们还会在设计时初始化一个新的DbContext。”
如果连接字符串无效或连接无法建立,您似乎会遇到您提到的异常。

2
补充Slauma的回答,你需要在某个地方设置初始化器,以便RIA在设计时检测到它。(我还没有涉及CF + RIA。)把它放在连接字符串中怎么样?http://blog.oneunicorn.com/2011/03/31/configuring-database-initializers-in-a-config-file/ - Julie Lerman
@Julie:哦,我不知道在配置中设置初始化器是可能的。好知道。如果它解决了问题,你必须将你的评论转换为答案。但我想知道:如果RIA在设计时调用任何构造函数来实例化派生上下文,那么它不应该是默认构造函数吗?正如问题中所示,它会将初始化器设置为“null”。奇怪的是RIA仍然尝试连接到数据库。 - Slauma
@Antti:我不知道。在这两篇博客文章的评论中,人们经常抱怨同样的问题,但我实际上无法在这些评论中找到解决方案。在我的第二个链接的评论下面的某个地方,建议下载并使用RIA SP2,并声称这将解决问题。但我看不到任何人确认这一点。你试过Julie的想法,在配置文件中将初始化器设置为“null”吗? - Slauma
@Antti:看起来你可以在Julie上面的评论中链接的文章中查看“摘要”之前的最后一段代码片段。 - Slauma
1
Varun还表示这可能无法实现(http://varunpuranik.wordpress.com/2011/06/29/wcf-ria-services-support-for-ef-4-1-and-ef-code-first/#comment-122)。我也尝试使用WCF RIA Services SP2版本,但没有成功。结论是,在构建EF Code First + RIA Services项目时,需要在构建期间使用一个可用的数据库。 - Antti Simonen
显示剩余3条评论

1

谢谢你的建议!我相信这将在未来派上用场。目前,我已经放弃了CodeFirst方法,并等待vNext看看是否有所改进。 - Antti Simonen
不错的选择。我甚至后悔尝试当前版本的CodeFirst。对于简单的事情,它还可以,但是一旦涉及到超出给定示例的场景,你就会遇到麻烦。 - Josh Mouch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接