1

我有一个奇怪的问题,它已经烧掉了比它应该的时间更长的时间。

我的主要问题是: 添加实体时,什么可能导致 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)});
  • 我试图访问公司对象上的用户列表。那是行不通的。
  • 我尝试使用 context.Users.Create() 而不是 new User()。不会改变任何东西。
  • 我尝试注入SQL,仍然是同样的问题。如果从 Studio Manager 运行,则该确切的 SQL 有效。
  • 每次添加后我都尝试过 context.SaveChanges() ,没有任何改变。

我知道要添加的实体的状态是正确的,在 CompanyId 设置为 NULL 的情况下也是如此。我的底层数据库可能有问题吗?

非常感谢您的时间和帮助!

4

2 回答 2

5

尝试以下操作:

 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 以确保每条添加的记录都放入数据库中。

最后,您检查了 user.CompanyId = 1,是否应该 == 1

于 2013-02-12T10:36:32.460 回答
0

我最终将用户列表转换为一系列 SQL 语句,并通过context.Database.ExecuteSqlCommand(sql)运行它们。

它很脏,但它有效。

如果有人对为什么用户实体上的 FK CompanyId 有时设置为 NULL 有任何好的想法,如果您能分享您的想法,我们将非常高兴。

于 2013-02-13T11:13:11.803 回答