EF Core-EF不保存关系的添加元素

时间:2018-07-25 07:53:35

标签: c# entity-framework entity-framework-core asp.net-core-webapi

我在将多个新对象添加到用户类(关系)中的集合中时遇到问题,一个用户可以有很多项目

但是由于某种原因,上下文无法将其正确保存在用户内部。

此代码的结果:

  • 用户已添加到_context.UsersTable中,并且可以从其他控制器读取

  • Item已添加到_context.ItemsTable(可以从其他控制器读取),但是User和Item之间没有任何连接。

  • 用户处的项目集合始终为空。

    public class User
    {
        [Key]
        public Guid Id { get;  set; }
        public virtual ICollection<Item> Items { get; set; } = new HashSet<Items>();
        protected User()
        {
    
        }
        public User(string login, string password)
        {
            (...)
        }
    }
    
    public class Item
    {
        [Key]
        public virtual User User { get; set; }
        public string ItemName { get; set; }
    
        protected Item()
        {
    
        }
    
        public Item(string name, User user)
        {
            Id = new Guid();
            this.User = user;
            ItemName = name;
        }
    }
    
    public class AppContext : DbContext
    {
        public AppContext(DbContextOptions<AppContext> options) : base(options)
        {
            Database.SetCommandTimeout(35000);
        }
    
        public DbSet<User> UsersTable { get; set; }
        public DbSet<Items> ItemsTable { get; set; }
    }
    
    
    
    public IActionResult register([FromBody]Register command)
    {
        var newUser = new User(command.login, password);
        var newItem = new Item("TEST", newUser);
    
        _context.Entry(newUser).State = EntityState.Modified;
    
        newUser.Items.Add(newItem);
    
        _context.UsersTable.Add(newUser);
    
        _context.ItemsTable.Add(newItem);
    
        _context.SaveChanges();
    }
    

1 个答案:

答案 0 :(得分:1)

您的Item类是错误的,您需要这样做:

public class Item
{
    [Key]
    public Guid Id { get; set; }

    public string ItemName { get; set; }

    // Relation to User
    public Guid UserId { get; set; }
    public virtual User User { get; set; }

    protected Item()
    {    }

    public Item(string name, User user)
    {
        Id = Guid.NewGuid();
        UserId = user.Id;
        ItemName = name;
    }
}

注册方法:

public IActionResult register([FromBody]Register command)
{
    var newUser = new User(command.login, password);
    var newItem = new Item("TEST", newUser);

    newUser.Items.Add(newItem);
    _context.UsersTable.Add(newUser);
    _context.ItemsTable.Add(newItem); // Edit : I'm not sure, but try it without this line, it should work
    _context.SaveChanges();
}