实体框架将项目添加到ICollection错误

Phi*_*ade 3 .net c# entity-framework ef-code-first

我有两个简单的类,User并且Task:

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; }
}
Run Code Online (Sandbox Code Playgroud)

Task类有一个属性Followers是一个ICollection<User>

这是db上下文类:

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是主程序中的代码:

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();
Run Code Online (Sandbox Code Playgroud)

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

Object reference not set to an instance of an object.

我究竟做错了什么?

quj*_*jck 5

问题是该Followers集合为空.而不是新建你的课程,让EF 为你创建它们......

var user = db.Users.Create();
Run Code Online (Sandbox Code Playgroud)

var task = db.Tasks.Create();
Run Code Online (Sandbox Code Playgroud)

如果您仍然遇到问题,那么您的代理服务器就不会被创建.您可以在类构造函数中初始化集合,使每个集合成为一个集合HashSet<T>.虽然找出代理没有生成的原因会更好......

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; }
}
Run Code Online (Sandbox Code Playgroud)