EntityFramework 4.1,上下文.实体.Add有时会将FK设置为NULL



我遇到了一个奇怪的问题,它已经消耗了比应该消耗的时间多得多的时间。

我的主要问题是:添加实体时,是什么原因导致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有什么好的想法,如果你能分享你的想法,我会非常高兴。

最新更新