asp.net 无法在一个到多个字段上添加/追加对象,即ICollection< obj>

bq3bfh9z  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(126)
//Contact class model
public class Contact
    {
        [Key]
        public int Id { get; set; }
        public required IdentityUser User { get; set; }
        public ICollection<ChatRoom> ChatRooms { get; set; }
    }

// ChatRoom class model
public class ChatRoom
    {
        [Key]
        public int Id { get; set; }
        public string? Name { get; set; }
        public ICollection<Message> MessageObjs { get; set; } = new List<Message>();
    }

这是我的控制器,在这里我无法添加chat_room对象到other_userloged_in_user联系人.只有other_user的值保存在数据库中。

public async Task<IActionResult> CreateRoom(int contact_id, string email, string room_name)
        {

            Contact loged_in_user = _context.Contact.Where(c => c.Id == contact_id).Include(c => c.ChatRooms).First();
            Contact other_user = _context.Contact.Where(c =>c.User.Email == email).Include(c => c.ChatRooms).First();

            ChatRoom chat_room = new ChatRoom()
            {
                Name = room_name,
            };
            

            _context.ChatRoom.Add(chat_room);
            
            other_user.ChatRooms.Add(chat_room);
            loged_in_user.ChatRooms.Add(chat_room);
            _context.SaveChanges();
            
            return View("Index");
        }
qjp7pelc

qjp7pelc1#

这是我的控制器,在这里我无法添加chat_room对象到other_user和loged_in_user联系人.只有other_user的值被保存在数据库中。
实际上,它只考虑最后一个语句,也就是loged_in_user.ChatRooms.Add(chat_room);,所以,根据你的查询和对象创建,如果你看一下记录器,它只会执行一个插入语句到SQL数据库中,如下所示:

这是因为,当你查询Contact loged_in_user时,它会找到一个实体,而Contact other_user会找到另一个实体,如果你查看查询跟踪器,它只会分配ChatRoom chat_room对象一次,因为实体框架不允许单个对象进入两个不同的实体。因此,只有你的最后一句话考虑插入。

如果你想同时更新两个实体,你需要创建ChatRoom chat_room两次。我已经模拟过了,几次测试,你可以试试这种方法。

int contact_id = 1;
        string email = "TestUser2.com";
        string room_name = "my chat room";

        Contact loged_in_user = _context.Contacts.Where(c => c.Id == contact_id).Include(c => c.ChatRooms).First();
        Contact other_user = _context.Contacts.Where(c => c.User.Email == email).Include(c => c.ChatRooms).First();

        

      

         var chatroom2 = new ChatRoom { Name = room_name };

        loged_in_user.ChatRooms.Add(chatroom2);

        var chatroom3 = new ChatRoom { Name = room_name };
        other_user.ChatRooms.Add(chatroom3);
      
        await _context.SaveChangesAsync();

如果你看一下记录器,你会看到,上面的修改在数据库中创建了两个插入语句,通过sql switch case语句。

输出量:

**注:**如需了解更多详情,可点击efer to this official document.

相关问题