假设我有这种简化的结构
class User
{
int Id;
string Name;
List<UserItem> Items;
}
class Item
{
int Id;
string Name;
}
class UserItem
{
int Id;
int UserId;
int ItemId;
int Value;
[ForeignKey("UserId")]
User User;
[ForeignKey("ItemId")]
Item Item;
}
现在,我们可以为用户添加新项
User user = context.Users.Include(u => u.Items).ThenInclude(i => i.Item).FirstOrDefault(u => u.Id == 1);
Item item = context.Items.FirstOrDefault(i => i.Id == 123);
UserItem userItem = new UserItem();
userItem.UserId = user.Id;
userItem.User = user;
userItem.ItemId = item.Id;
userItem.Item = item;
userItem.Value = 123;
context.Add(userItem);
context.SaveChanges();
发生异常是因为如果我手动设置外键值,EF会尝试插入该项目。如果我仅设置ID,则没有问题。但是,我需要使用外键值,因为它们在代码的其他位置也需要。
查询用户时我不能使用AsNoTracking()
,因为我想跟踪用户及其UserItems(而不是Item)。
我已经用context.Entity(item).State = EntityState.Unchanged
解决了这个问题,这似乎有点hacky。