使用者:实体框架(代码优先)、SQLite。
有主题和用户模型。一个用户可以创建多个主题。
public class Topic
{
public int Id { get; set; }
public string Title { get; set; }
public int UserId { get; set; }
public User User { get; set; }
}
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Topic> Topics { get; set; }
}
我创建了一个主题对象,里面有一个用户对象,我写入数据库,一切正常:
using (AppDbContext context = new AppDbContext())
{
var user1 = new User
{
Id = 1,
Name = "Jon"
};
var topic1 = new Topic
{
Id = 1,
Title = "First",
User = user1
};
context.Topics.AddOrUpdate(topic1);
context.SaveChanges();
}
问题
如果您添加一个新主题,但使用相同的用户,则会抛出异常:
更新条目时出错。有关详细信息,请参阅内部异常。
约束失败 UNIQUE 约束失败:Users.Id
那些。据我所知,重新尝试插入现有用户。
我需要用户不被重新插入Add,而是被更新AddOrUpdate。
请告诉我,该怎么做?
AddOrUpdate 方法仅用于迁移,在其他情况下最好不要使用它。
您可以使用Attach方法解决问题,然后当您调用 SaveChanges 时将不会尝试保存用户,因为对象的上下文将被提取并且 EF 将知道它存在于数据库中并且没有更改。
或者您可以指定 UserId,但不附加。结果是一样的。