2012-05-25 99 views
0

我有一個非常簡單的帶有2個表的數據庫:Test和Tester,Test有一個Id和一個名稱,Tester有一個Id,一個TestName和一個TestId。兩者之間有1:N連接。我只是想添加一個新的條目到一個表中,但我得到了一個空引用異常。Code-First:將實體添加到dbset時的空引用異常

我有一類上下文:

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

所以,當我嘗試了「新的測試」添加到我得到一個空引用異常的測試。如果我將添加部分放出,它會完美運行,但是我失去了將新實體添加到集合的功能。有人能告訴我可能會出錯嗎?乾杯!

+1

NULL是什麼?它是'_context.Tests'嗎?或者它是'DbContext'裏面的東西? –

+0

DbContext和_context.Tests一起很好。它會在add函數內引發空引用異常。 – JahManCan

回答

1

模型和配置中存在問題。表格之間的連接錯誤。

+0

請您詳細說明具體是錯的?我想我有同樣的問題... –

+0

其實我確定我的問題是線程。我在事件處理程序中添加了一個事件處理程序給DbContext.Set().Local.ToBindingList().ListChanged並試圖訪問DbContext。 DbContext.Set()在執行期間返回null。 –

+1

對我來說,我從一磚一瓦的配置開始。不幸的是,我不能記得什麼exaclt錯了。但是HasOptional(t => t.testers).WithRequired(tr => t.Test)之類的東西一定是這樣的。有趣的是我在調試過程中無法確定它。只是用Add方法拋出一個異常。 – JahManCan

0

好的。我也遇到了這個問題。對我而言,這是因爲我有一個WPF應用程序試圖在其中一個ICommands中讀取我的EntityState,而我的實體正在被事件觸發器修改。不知道爲什麼,這是一個問題,因爲我看到的一切是一樣的調度線程上,而是通過使用

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

因爲這是我在事件中的代碼,我能解決我的問題。

希望這可以幫助別人。

1

希望這會幫助別人......

我碰到了類似的問題,其對DbSet.Add一個NullReferenceException和最逗的是,它僅稱爲控制器動作每個DbSet發生過一次。有三個,所以經過三次重複請求代碼成功。

原因:我在調用Add之前調用了一個異步數據庫讀取,並且只在最後等待它。當我在這些電話前移動等待時,問題就消失了。

這將導致該問題

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