自动递增外键并在我不想的表中添加新行


我有一个名为 Users 的表,外键为">

BranchOffice_Id",还有一个名为 BranchOffice 的表,其自动递增主键为"Id"。我在将数据添加到用户表中时遇到了一些问题。这是我的代码,使用实体框架用 C# 编写。

currentUser = new User()
{
Username = username,
UserType = UserType.User,
Email = email,
Name = name,
BranchOffice = _taskService.GetBranchOfficeById(branchOffice)
};
_db.Users.Add(currentUser);
_db.SaveChanges();

_db.Users.Add(currentUser);之前,currentUser.BranchOffice 的值为 1,对应于 BranchOffice 表的 Id #1。但问题是:在_db.SaveChanges();上,它不会保存该值,而是保存一个递增的值(它从"5"开始,尽管在 BranchOffice 表中我只有 4 行)。最后但并非最不重要的一点是,它向 BranchOffice 表添加了一个新行!

这是我的模型:

public class User : IPrincipal, IIdentity
{
[Key]
public string Username { get; set; }
public UserType UserType { get; set; }
public string Email { get; set; }
public string Name { get; set; }
public virtual BranchOffice BranchOffice { get; set; }
}
public class BranchOffice
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}

Entity添加到DbSet时,EF 会自动添加不属于数据库的所有相关实体。

使用您的代码,您可以在以下期间有 3 种不同的情况

BranchOffice = _taskService.GetBranchOfficeById(branchOffice)
_db.SaveChanges();
  1. 如果_taskService使用_db上下文从数据库中读取BranchOffice,EF 将添加具有指定BranchOffice的新User
  2. 如果_taskService使用不同的上下文从数据库中读取BranchOffice,EF 将引发异常。
  3. 如果_taskService创建新BranchOffice(在任何上下文之外,并且未将BranchOffice附加到_db上下文),EF 会将BranchOffice插入数据库中,检索BranchOffice。从数据库中Id,更新"内存中"User,在数据库中插入User

第三个可能是您的情况(您没有Id= 5 的BranchOffice,但 EF 创建了它)

相关内容

最新更新