自动增加了外键,并在我不想要的表格中添加了新行

时间:2017-07-04 20:11:03

标签: c# sql-server entity-framework model controller

我有一个名为Users的表,其中包含外键" BranchOffice_Id"和一个名为BranchOffice的表,其中包含一个自动递增的主键" Id"。我在向Users表中添加数据时遇到了一些问题。这是我的代码,使用实体框架用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; }
}

1 个答案:

答案 0 :(得分:0)

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

使用您的代码,您可以在

期间有3种不同的案例
BranchOffice = _taskService.GetBranchOfficeById(branchOffice)

_db.SaveChanges();
  1. 如果_taskService使用BranchOffice上下文从数据库中读取_db,则EF会添加一个具有指定User的新BranchOffice
  2. 如果_taskService使用不同的上下文从数据库中读取BranchOffice,EF将引发异常。
  3. 如果_taskService创建了新的BranchOffice(在任何上下文之外,并且未将BranchOffice附加到_db上下文),则EF会插入BranchOffice在数据库中,从数据库中检索BranchOfficeId,更新内存User,在数据库中插入User
  4. 第三种可能就是你的情况(你没有BranchOffice Id = 5但是EF创造了它)