小编Tro*_*ier的帖子

在Using语句中创建ObjectContext时出现NullReferenceException

时间再次吸引更多的思想.

我遇到了一个非常奇怪的现象.正如标题所述,我在尝试创建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

12
推荐指数
1
解决办法
436
查看次数

我的自定义DbExecutionStrategy没有被调用

我最初的问题是更新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)

c# sql-server database-deadlocks entity-framework-6

5
推荐指数
1
解决办法
527
查看次数