代码优先:将实体添加到数据库集时出现空引用异常

本文关键字:异常 引用 数据库 添加 实体 代码 | 更新日期: 2023-09-27 18:35:24

我有一个非常简单的数据库,有 2 个表:测试和测试器,测试有一个 ID 和一个名称,测试器有一个 Id 一个测试名称和一个测试ID。两者之间有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);
    }

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

代码优先:将实体添加到数据库集时出现空引用异常

希望这会对某人有所帮助...

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

原因:我在调用 Add 之前调用了异步数据库读取,并且只在最后等待它。当我在这些电话前面移动等待时,问题就消失了。

这将导致问题

var task = UserManager.FindByIdAsync(User.Identity.GetUserId()); // Uses the same DB Context
DbContext.Stages.Add(...);
await task;

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

好的。 我也遇到了这个问题。 对我来说,这是因为我有一个 WPF 应用程序,它试图在其 ICommand 之一中读取我的实体状态,而我的实体正在被事件触发器修改。 不知道为什么这是一个问题,因为我看到所有内容都在同一个调度程序线程上,但是通过使用

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

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

希望这对其他人有所帮助。