2

我一直在su.Companies.Add(co)上得到NullReferenceException;線。 我會認爲,與我的模型定義的方式它應該工作。自動完成,聽起來像一個新手,完成這個很好。我顯然是EntityFramework的新手。實體框架代碼首先多對多NullReference

幫助?

using (var db = new TicketdocketEntities()) 
{ 
    var su = new SiteUser { UserName = model.UserName }; 
    db.SiteUser.Add(su); 
    var co = new Company { Name = "Hello" }; 
    su.Companies.Add(co); 
    db.SaveChanges(); 
} 

模型

public class Company 
{ 
    [Key] 
    public int CompanyId { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<SiteUser> SiteUsers { get; set; } 
} 

public class SiteUser 
{ 
    [Key] 
    public int SiteUserID { get; set; } 
    public string UserName { get; set; } 

    public virtual ICollection<Company> Companies { get; set; } 
} 

public class TicketdocketEntities : DbContext 
{ 
    public DbSet<Company> Companies { get; set; } 
    public DbSet<SiteUser> SiteUser { get; set; } 
} 

回答

6

你仍然需要一個實際的列表來初始化屬性:

public class SiteUser 
{ 
    public SiteUser() 
    { 
     Companies = new List<Company>(); 
    } 

    [Key] 
    public int SiteUserID { get; set; } 
    public string UserName { get; set; } 

    public virtual ICollection<Company> Companies { get; set; } 
} 
+0

謝謝。這很好。 – user842876

+0

問題是,它應該沒有這種解決方法,因爲修飾符虛擬應該意味着,該集合將被延遲加載。當你創建這樣的結構時,每次選擇SiteUser時,EF都會實例化新的SiteUser,並用數據庫中的數據填充它,但公司列表將因爲名爲 –

+0

的構造函數而爲空,並且從一些未指定的原因添加懶加載 –

1

對於其他人誰可能會遇到這個問題(因爲我只是做了).. ..

使用實際列表初始化屬性是修復NullReferenceException的正確方法。但是,正如marek_lani指出的那樣,它不應該在模型本身內完成,因爲所有的SiteUser對象都會有一個空的公司列表,然後需要填充。正確的方式或者對我來說更好的方法是在su.Companies.Add()語句之前將相同的代碼放入控制器操作中。

using (var db = new TicketdocketEntities()) 
{ 
    var su = new SiteUser 
     { 
      UserName = model.UserName, 
      Companies = new List<Company>() 
     }; 
    db.SiteUser.Add(su); 
    var co = new Company { Name = "Hello" }; 
    su.Companies.Add(co); 
    db.SaveChanges(); 
}