【问题标题】:Entity Framework Code First Many to Many NullReference实体框架代码优先多对多 NullReference
【发布时间】:2012-06-27 01:10:45
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您仍然需要使用实际列表来初始化属性:

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

    【讨论】:

    • 问题是,它应该在没有这种解决方法的情况下工作,因为修饰符 virtual 应该意味着,该集合将被延迟加载。当您像这样创建结构时,每次选择 SiteUser 时,EF 都会实例化新的 SiteUser 并用数据库中的数据填充它,但公司列表将为空,因为调用了构造函数
    • 并且添加,由于某些未指定的原因,该集合没有延迟加载
    • 谢谢!我一直在环顾四周,找不到答案,但这有效!
    【解决方案2】:

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

    使用实际列表初始化属性是修复 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      相关资源
      最近更新 更多