我遇到了一个奇怪的问题,它已经消耗了比应该消耗的时间多得多的时间。
我的主要问题是:添加实体时,是什么原因导致EF 4.1 Code First将外键设置为NULL
问题是:我的文件中有一个用户列表,如果这些用户还没有,就必须将它们插入到我的数据库中。
我有这样的东西:
foreach (var u in usersFromFile) {
var userProfile = context.Users
.FirstOrDefault(user=>
user.EmployeeId == u.EmployeeId && user.CompanyId == 1);
if (userProfile == null) {
User newUser = new User();
newUser.EmployeeId = u.EmployeeId;
newUser.CompanyId = 1;
context.Users.Add(newUser); //This will sometimes set CompanyId = NULL
}
}
context.SaveChanges();
某些用户将无法正确添加到"用户"表中。它们得到CompanyId==NULL,因此它们不属于该公司。
我还尝试过直接注入SQL,如下所示:
var query = @"INSERT INTO [dbo].[Users]
([CompanyId],[EmployeeId]) VALUES (3,@emplid)";
context.Database.ExecuteSqlCommand(query, new SqlParameter[] {
new SqlParameter("emplid", u.EmployeeId)});
- 我已尝试访问"公司"对象上的"用户"列表。这行不通
- 我试着使用上下文。Users.Create()而不是new User()。不会改变任何事情
- 我尝试过注入SQL,仍然存在同样的问题。如果从Studio管理器运行,那么这个SQL就可以工作
- 我已经试过了上下文。SaveChanges()每次添加后,没有任何更改
我知道要添加的实体的状态是正确的,在CompanyId设置为NULL的情况下也是如此。我的底层数据库可能有什么问题吗?
非常感谢您的时间和帮助!
尝试以下操作:
foreach (var u in usersFromFile) {
if (context.Users.Any(
user=>
user.EmployeeId == u.EmployeeId && user.CompanyId == 1)
)
{
User newUser = new User();
newUser.EmployeeId = u.EmployeeId;
newUser.CompanyId = 1;
context.Users.Add(newUser); //This will sometimes set CompanyId = NULL
}
}
context.SaveChanges();
Any()函数检查基于给定查询的用户是否存在。
另外,不要忘记添加context.savechanges,以确保添加的每个记录都被放入数据库中。
最后,您检查了是否为用户。CompanyId=1,应为==1
我最终将用户列表转换为一系列SQL语句,并通过context.Database.ExecuteSqlCommand(SQL).运行它们
它很脏,但很管用。
如果有人对用户实体上的FK CompanyId有时设置为NULL有什么好的想法,如果你能分享你的想法,我会非常高兴。