我有一个名为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; }
}
答案 0 :(得分:0)
向Entity
添加DbSet
时,EF会自动添加不属于数据库的所有相关实体。
使用您的代码,您可以在
期间有3种不同的案例BranchOffice = _taskService.GetBranchOfficeById(branchOffice)
_db.SaveChanges();
_taskService
使用BranchOffice
上下文从数据库中读取_db
,则EF会添加一个具有指定User
的新BranchOffice
。 _taskService
使用不同的上下文从数据库中读取BranchOffice
,EF将引发异常。 _taskService
创建了新的BranchOffice
(在任何上下文之外,并且未将BranchOffice
附加到_db
上下文),则EF会插入BranchOffice
在数据库中,从数据库中检索BranchOffice
。Id
,更新内存User
,在数据库中插入User
。 第三种可能就是你的情况(你没有BranchOffice
Id
= 5但是EF创造了它)