繁体   English   中英

如何在Entity Framework Core中将项目添加到多对多关系表中?

[英]How to add an item to a many-to-many relationship table in Entity Framework Core?

在我的EF Core数据模型中,我有两个表,第一个表的第二个表具有ICollection Navigation属性,第二个表的第一个表也具有ICollection Navigation属性。

资料模型

public class MyUser
{
    [Key]
    public string UserName { get; set; }
    public ICollection<Vote> Votes { get; set; }
    public virtual ICollection<PrivateUser> Rooms { get; set; }
}

public class PrivateUser
{
    [Key]
    public string RoomName { get; set; }
    public virtual ICollection<MyUser> Users { get; set; }
}

当我第一次添加仅具有名称的MyUser时,

 appuser = new MyUser
 {
      UserName = Context.User.Identity.Name
 };
 _context.MyUser.Add(appuser);
 _context.SaveChanges();

它正确地将用户添加到表,但是当我尝试添加PrivateUser与现有MyUser或我尝试更新现有MyUser它给人NullReferenceException从下面的代码。

PrivateUser roma = new PrivateUser() { RoomName = roomName};
try
{
    var user = new MyUser() { UserName = Context.User.Identity.Name };
    user.Rooms.Add(roma);
    _context.MyUsers.Attach(user).Property(u => u.Rooms).IsModified = true;
    roma.Users.Add(user);
    await _context.Rooms.AddAsync(roma);
    await _context.SaveChangesAsync();
}
catch(Exception ex)
{
    Console.WriteLine(ex.ToString());
}

我还在ModelBuilder中配置了它。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
     base.OnModelCreating(modelBuilder);
     modelBuilder.Entity<MyUser>().HasMany(u => u.Rooms);
     modelBuilder.Entity<PrivateUser>().HasMany(c => c.Users);

}

我是EF Core的初学者,有人可以向我解释当两个表都引用自己时如何以正确的方式保存字段。

经过长时间的调查,我发现实体模型没有问题,原因是因为我在第一次Migration使用ModelBuilder解决了该问题

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<MyUser>().HasMany(u => u.Rooms);
   modelBuilder.Entity<PrivateUser>().HasMany(c => c.Users);
}

问题出在我的try块中,请参见下面的正确代码。

try
{
    var user = new MyUser() { UserName = Context.User.Identity.Name };
    //here I was doing user.Rooms.Add(roma); where Romms is null
    roma.Rooms = new ICollection<PrivateUser>();
    //now we can add the room to Rooms
    user.Rooms.Add(roma);
    //and here was the below commented code from a Stackoverflow Answer
    //_context.MyUsers.Attach(user).Property(u => u.Rooms).IsModified = true;
    //we just have to use Update here;
    _context.MyUsers.Attach(user);
    _context.MyUsers.Update(user);
    roma.Users.Add(user);
    await _context.Rooms.AddAsync(roma);
    await _context.SaveChangesAsync();
}

现在一切都按预期进行。 谢谢...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM