0

TestとTester、TestにはIdとName、TesterにはTestNameとTestIdの2つのテーブルがある非常に単純なデータベースがあります。2つの間に1:N接続があります。私がやりたいのは、テーブルの1つに新しいエントリを追加することですが、null参照例外が発生しました。

コンテキスト用のクラスがあります:

 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());
    }
}

2つの構成ファイルには、関係といくつかの制限が含まれています。

そして、オブジェクトの1つに新しいエンティティを追加できる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);
    }

したがって、「新しいテスト」をテストに追加しようとすると、null参照例外が発生しました。また、追加部分を省略した場合、完全に実行されますが、コレクションに新しいエンティティを追加する機能が失われます。誰かが私に何がうまくいかないかアドバイスしてもらえますか?乾杯!

4

3 に答える 3

1

うまくいけば、これは誰かを助けるでしょう...

DbSet.AddでNullReferenceExceptionが発生するという同様の問題が発生しました。面白いのは、コントローラーアクションで呼び出されたDbSetごとに1回だけ発生したことです。3つあったので、3回繰り返し要求した後、コードは成功しました。

理由: Addを呼び出す前に非同期DB読み取りを呼び出し、最後にそれを待つだけでした。私がこれらの電話の前で待機を移動したとき、問題はなくなりました。

これは問題を引き起こします

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

モデルと構成に問題がありました。テーブル間の接続が間違っています。

于 2012-06-01T12:13:14.263 に答える
0

わかった。私もこの問題に遭遇しました。私にとっては、エンティティがイベントトリガーによって変更されているときに、ICommandの1つでEntityStateを読み取ろうとしたWPFアプリケーションがあったためです。すべてが同じディスパッチャスレッド上にあることがわかったので、なぜこれが問題になったのかわかりませんが、

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

私のイベントにあったコードについては、問題を解決することができました。

うまくいけば、これは他の誰かを助けるでしょう。

于 2012-11-27T17:36:04.747 に答える