实体框架代码首先是多对多的NullReference

时间:2012-06-27 01:10:45

标签: asp.net-mvc entity-framework-4 entity-framework-4.1 ef-code-first entity-relationship

我一直在su.Companies.Add(co)上得到一个NullReferenceException;线。 我认为,通过我的模型定义方式,它应该工作。自动完成,听起来像一个新手,完成这很好。我显然是EntityFramework的新手。

帮助?

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

2 个答案:

答案 0 :(得分: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; } 
} 

答案 1 :(得分: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();
}