EntityFramework 4.1,context.Entities.Add有时会将FK设置为​​NULL

时间:2013-02-12 10:29:41

标签: c# sql entity-framework

我有这个奇怪的问题,燃烧的时间超过了应有的时间。

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

我知道即将添加的实体的状态是正确的,同样在CompanyId设置为NULL的情况下也是如此。 我的底层数据库可能有什么东西吗?

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

它很脏但是有效。

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