0

我有一个非常简单的数据库,其中包含 2 个表:Test 和 Tester,Test 有一个 Id 和一个 Name,Tester 有一个 Id、一个 TestName 和一个 TestId。两者之间存在 1 : N 连接。我只是喜欢做的是向其中一个表添加一个新条目,但我得到了一个空引用异常。

我有一个上下文类:

 public class TestContext : DbContext, ITestContext
{
    public DbSet<Test> Tests { get; set; }
    public DbSet<Tester> Testers { get; set; }

    public TestContext()
        : base(){}

    public TestContext(DbConnection connection) : base (connection, false)
    {

    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new TestConfiguration());
        modelBuilder.Configurations.Add(new TesterConfiguration());
    }
}

这两个配置文件包含关系和一些限制。

我有一个 EntityManager 类,可以将新实体添加到对象之一:

    private ITestContext _context;

    public ObservableCollection<Test> Tests { get; set; }
    public ObservableCollection<Tester> Testers { get; set; }

    private static EntityManager _instance;
    public static EntityManager Instance
    {
        get { return _instance ?? (_instance = new EntityManager()); }
    }

    private EntityManager()
    {
        Tests = new ObservableCollection<Test>();
        Testers = new ObservableCollection<Tester>();

        Database.DefaultConnectionFactory = new SqlConnectionFactory("System.Data.SqlClient");
        connection = Database.DefaultConnectionFactory.CreateConnection(@"Data Source=.;Initial Catalog=Test;Integrated Security=True");

        _context = new TestContext(connection);

        _context.Tests.Add(new Test {Name = "new Test"});
        _context.SaveChanges();
        LoadData();
    }


    private void LoadData()
    {
        Tests.Clear();
        Testers.Clear();

        _context.Tests.ToList().ForEach(Tests.Add);
        _context.Testers.ToList().ForEach(Testers.Add);
    }

因此,当我尝试将“新测试”添加到测试中时,我得到了一个空引用异常。如果我将添加部分排除在外,它会完美运行,但是我失去了将新实体添加到集合的功能。有人可以告诉我可能出什么问题吗?干杯!

4

3 回答 3

1

希望这会帮助某人...

我遇到了一个类似的问题,在 DbSet.Add 上有一个 NullReferenceException,有趣的是它只发生在控制器操作中调用的每个 DbSet 一次。有三个,所以在三个重复请求之后,代码成功了。

原因:我在调用 Add 之前调用了异步 DB 读取,最后只等待它。当我将 await 移到这些调用前面时,问题就消失了。

这会导致问题

var task = UserManager.FindByIdAsync(User.Identity.GetUserId()); // Uses the same DB Context
DbContext.Stages.Add(...);
await task;
于 2016-04-11T15:10:44.457 回答
0

好的。我也遇到了这个问题。对我来说,这是因为我有一个 WPF 应用程序试图在它的一个 ICommands 中读取我的 EntityState,而我的 Entity 正在被事件触发器修改。不知道为什么这是一个问题,因为我看到所有东西都在同一个 Dispatcher 线程上,但是通过使用

System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => MyEntity.MyEntityProperty=SomeValue));

对于我的事件中的代码,我能够解决我的问题。

希望这对其他人有帮助。

于 2012-11-27T17:36:04.747 回答
0

模型和配置存在问题。表之间的错误连接。

于 2012-06-01T12:13:14.263 回答