【问题标题】:Entity Framework adding item to ICollection error实体框架将项目添加到 ICollection 错误
【发布时间】:2013-06-03 14:15:21
【问题描述】:

我有两个简单的类,UserTask

class User
{
    public int UserId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
}

class Task
{
    public int TaskId { get; set; }
    public string Name { get; set; }
    public DateTime CreatedAt { get; set; }
    public virtual ICollection<User> Followers { get; set; }
}

Task 类有一个属性Followers,它是一个ICollection&lt;User&gt;

这里是数据库上下文类:

class MyContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public DbSet<Task> Tasks { get; set; }

        protected override void OnModelCreating(DbModelBuilder mb)
        {
            mb.Entity<User>().HasKey(u => u.UserId); 
            mb.Entity<Task>().HasKey(t => t.TaskId);
        }
    }

这是主程序中的代码:

var db = new MyContext();

var user = new User();
user.Name = "John Doe";
user.Email = "jd@email.com";
db.Users.Add(user);
db.SaveChanges();

var follower = db.Users.Where(u => u.Name == "John Doe").FirstOrDefault();

var task = new Task();
task.Name = "Make the tea";
task.CreatedAt = DateTime.Now;
task.Followers.Add(follower);  // ERROR

db.Tasks.Add(task);

db.SaveChanges();

问题是我在尝试将追随者添加到任务时遇到错误。

Object reference not set to an instance of an object.

我做错了什么?

【问题讨论】:

  • Icollection是一个接口,改成list
  • @Ofiris 请参阅此帖子以获取示例 - ICollection 是推荐的实现 stackoverflow.com/questions/6439425/…
  • 用户和任务是什么关系??是一对多吗?
  • 看我的回答。可能是初始化问题

标签: c# .net entity-framework ef-code-first


【解决方案1】:

问题是Followers 集合为空。与其更新你的课程,不如让 EF create 他们为你...

var user = db.Users.Create();

var task = db.Tasks.Create();

如果您仍然遇到问题,那么您的代理不会被创建。您可以在类构造函数中初始化集合,使每个集合成为HashSet&lt;T&gt;。不过最好确定代理没有生成的原因......

public class Task
{
    public Task()
    {
       Followers = new HashSet<User>();
    }
    public int TaskId { get; set; }
    public string Name { get; set; }
    public DateTime CreatedAt { get; set; }
    public virtual ICollection<User> Followers { get; set; }
}

【讨论】:

  • 我将它们更改为 Create,但这似乎并没有解决问题 - 仍然出现同样的错误。
  • EF 总是想要 HashSet,还是与集合的 ICollection 的类型无关?
  • 顺便说一句,对于其他来到这里并且必须实施解决方法的用户,原因可能描述为here
  • @Default 我相信这无关紧要。我们使用ICollection 的内部实现
【解决方案2】:

试试这个。只需初始化Follower

var db = new MyContext();

var user = new User();
user.Name = "John Doe";
user.Email = "jd@email.com";
db.Users.Add(user);
db.SaveChanges();

var follower = db.Users.Where(u => u.Name == "John Doe").FirstOrDefault();

var task = new Task();
task.Name = "Make the tea";
task.CreatedAt = DateTime.Now;
task.Followers =  new Collection<User>()
task.Followers.Add(follower);

db.Tasks.Add(task);

db.SaveChanges(); 

【讨论】:

    【解决方案3】:

    试试这个。您将不得不更改 qujck 提到的构造函数

            var db = new MyContext();
    
            var user = new User();
            user.Name = "John Doe";
            user.Email = "jd@email.com";
    
            var task = new Task();
            task.Name = "Make the tea";
            task.CreatedAt = DateTime.Now;
    
            task.Followers.Add(user);
            db.Tasks.Add(task);
            db.SaveChanges();
    

    【讨论】:

      【解决方案4】:

      你可以初始化List,因为ICollection是一个接口所以它不能被初始化,但是List可以(以下对我有用)

      代替:

      task.Followers.Add(follower);
      

      写:

      task.Followers= new List<User>();
      task.Followers.Add(follower);
      

      这应该可以解决您的问题:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-18
        • 2012-10-28
        • 2020-01-31
        • 2018-06-25
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        相关资源
        最近更新 更多