我的问题是由于存在两个上下文。我修改了代码,只保留一个上下文,问题就解决了。
我的用户(User)有一个用户联系人(UserContact)列表,其中每个联系人都有一个联系选项(ContactOption)。这是一个简单的1对多、多对1模型,中间有一个UserContact表。
如果我从数据库中提取用户并创建新的UserContact,但将ContactOption设置为现有项目(从数据库中提取),当我保存更改时,实体框架会在数据库中创建一个新的ContactOption,它基本上是我添加到UserContact的重复项(除了它获得一个新的id)。
我已经花费数小时来解决这个问题,但无法找到解决方法。有什么想法吗?
我使用存储库模式进行数据库查询,但我确保它们共享同一个上下文。
我使用以下代码从数据库中提取用户:
我的用户(User)有一个用户联系人(UserContact)列表,其中每个联系人都有一个联系选项(ContactOption)。这是一个简单的1对多、多对1模型,中间有一个UserContact表。
如果我从数据库中提取用户并创建新的UserContact,但将ContactOption设置为现有项目(从数据库中提取),当我保存更改时,实体框架会在数据库中创建一个新的ContactOption,它基本上是我添加到UserContact的重复项(除了它获得一个新的id)。
我已经花费数小时来解决这个问题,但无法找到解决方法。有什么想法吗?
我使用存储库模式进行数据库查询,但我确保它们共享同一个上下文。
我使用以下代码从数据库中提取用户:
var user = _context.Users.Include("UserContacts.ContactOption")
.Where(id => id == 1);
联系选项是通过以下方式提取的:
var co = _context.ContactOptions.FirstOrDefault(c => c.Id == id);
我将ContactOption添加到UserContact中,如下所示:
var contactOption = _context.ContactOptions.FirstOrDefault(c => c.Id == someId);
var contact = new UserContact { ContactOption = contactOption };
contact.Data = "someData";
user.UserContacts.Add(contact);
我的模型长这样:
public class User
{
[Key]
public int Id { get; set; }
public virtual ICollection<UserContact> UserContacts { get; set; }
}
public class UserContact
{
[Key]
public int Id { get; set; }
[Required]
public User User { get; set; }
[Required]
public ContactOption ContactOption { get; set; }
public string Data { get; set; }
}
public class ContactOption
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}