EF核心:关系和跟踪

时间:2019-08-09 10:18:49

标签: c# entity-framework-core

假设我有这种简化的结构

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。

0 个答案:

没有答案