2

我在 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; }
}
4

2 回答 2

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; } 
} 
于 2012-06-27T01:12:56.560 回答
1

对于其他可能遇到这个问题的人(就像我刚刚做的那样)......

使用实际列表初始化属性是修复 NullReferenceException 的正确方法。但是,正如 marek_lani 指出的那样,它不应该在模型本身内完成,因为所有 SiteUser 对象都将有一个空的 Companies 列表,然后需要填充。正确的方法,或者对我更有效的方法,是将相同的代码放在 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();
}
于 2015-04-26T22:27:38.560 回答