//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_user
和loged_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");
}
1条答案
按热度按时间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
两次。我已经模拟过了,几次测试,你可以试试这种方法。如果你看一下记录器,你会看到,上面的修改在数据库中创建了两个插入语句,通过sql switch case语句。
输出量:
**注:**如需了解更多详情,可点击efer to this official document.