时间再次吸引更多的思想.
我遇到了一个非常奇怪的现象.正如标题所述,我在尝试创建EF ObjectContext时遇到NullReferenceException,但是如果我在Using语句中创建上下文,我只会得到异常.我尝试了各种不同的方式,但总是一样.当然,这是直到昨天才能正常工作的代码.昨天早上我的Windows Update运行可能是相关的.
无论如何...
如果我试试这个
using (var context = new Entities(Env.Instance.Connection))
{
//do a bunch of EF stuff
}
Run Code Online (Sandbox Code Playgroud)
我在创建ObjectContext时得到NullReferenceException.这里的Env.Instance.Connection是在程序的早期创建的EntityConnection.我已经介入以确保实例和EntityConnection都存在.
如果我这样做的话
var context = new Entities(Env.Instance.Connection);
//do a bunch of EF stuff
context.Dispose();
Run Code Online (Sandbox Code Playgroud)
一切正常.
我试过了
using (var context = new Entities(Env.Instance.ConnectionName)) //the name of a connection string in my App.Config
{
//do a bunch of EF stuff
}
Run Code Online (Sandbox Code Playgroud)
我试过了
using (var context = new Entities(Env.Instance.ConnectionString)) //the actual connection string
{
//do a bunch of EF stuff
}
Run Code Online (Sandbox Code Playgroud)
我甚至试过了
using …Run Code Online (Sandbox Code Playgroud) c# entity-framework using-statement nullreferenceexception objectcontext
我最初的问题是更新SQL数据库时经常遇到死锁。通过一些研究,我发现我可以定义一个自定义DbConfiguration并使用它来定义一个DbExecutionStrategy,它指示Entity Framework在x毫秒和y次重复出现某些错误后自动重试。大!
因此,按照https://msdn.microsoft.com/zh-cn/data/jj680699上的指南,我构建了正在使用的自定义DbConfiguration,但是似乎忽略了关联的DbExecutionStrategy。
最初,我的整个DbConfiguration被忽略了,但是我发现这是因为我在app.config中引用了它,并使用DbConfigurationType属性[DbConfigurationType(typeof(MyConfiguration))]装饰了我的实体构造函数。现在,我仅使用app.config,至少正在调用我的自定义配置。
以最简单的形式,我的自定义配置如下所示:
public class MyConfiguration : DbConfiguration
{
public MyConfiguration()
{
System.Windows.MessageBox.Show("Hey! Here I am!"); //I threw this in just to check that I was calling the constructor. Simple breakpoints don't seem to work here.
SetExecutionStrategy("System.Data.SqlClient", () => new MyExecutionStrategy(3, TimeSpan.FromMilliseconds(500)));
}
}
Run Code Online (Sandbox Code Playgroud)
我的app.config中引用了我的自定义DbConfiguration,如下所示:
<entityFramework codeConfigurationType="MyDataLayer.MyConfiguration, MyDataLayer">
...
</entityFramework>
Run Code Online (Sandbox Code Playgroud)
我的自定义DbExecutionStrategy的构建方式如下:
private class MyExecutionStrategy : DbExecutionStrategy
{
public MyExecutionStrategy() : this(3, TimeSpan.FromSeconds(2))
{
System.Windows.MessageBox.Show($"MyExecutionStrategy instantiated through default constructor.");
}
public MyExecutionStrategy(int maxRetryCount, TimeSpan maxDelay) : base(maxRetryCount, …Run Code Online (Sandbox Code Playgroud)