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

C# EntityFramework 4.1,context.Entities.Add有时会将FK设置为NULL,c#,sql,entity-framework,C#,Sql,Entity Framework,我有一个奇怪的问题,这个问题已经持续了好几个小时 我的主要问题是: 添加实体时,什么可能导致EF 4.1代码首先将外键设置为NULL? 问题是:我的文件中有一个用户列表,如果这些用户不在我的数据库中,就必须将它们插入到我的数据库中 我有这样的想法: foreach (var u in usersFromFile) { var userProfile = context.Users .FirstOrDefault(user=> user.Emp

我有一个奇怪的问题,这个问题已经持续了好几个小时

我的主要问题是: 添加实体时,什么可能导致EF 4.1代码首先将外键设置为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管理器运行,那么这正是SQL的工作原理
  • 我尝试过在每次添加后添加context.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();
函数的作用是:根据给定的查询检查用户是否存在

另外,不要忘记添加context.savechanges以确保每个添加的记录都被放入数据库中

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

请尝试以下操作:

 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();
函数的作用是:根据给定的查询检查用户是否存在

另外,不要忘记添加context.savechanges以确保每个添加的记录都被放入数据库中


最后,您检查了user.CompanyId=1,should=1,我最终将用户列表转换为一系列SQL语句,并通过context.Database.ExecuteSqlCommand(SQL)运行它们

它很脏,但能用


如果有人对用户实体上的FK CompanyId有时设置为NULL有什么好的想法,我很乐意与您分享您的想法。

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

它很脏,但能用


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

感谢您指出我示例代码中的一些缺陷。对于这个简单的例子,我可以使用任意一个,但如果实体存在,我最终需要对它进行更改。我更新了我的初始条目以反映您发现的缺陷。遗憾的是,错误仍然存在于我的代码中。CompanyId有时仍然设置为NULL。您可以尝试从实体上下文中获取公司,并将用户添加到公司,而不是直接将实体添加到上下文中并说其Id为1。Try:var comp=context.Companys.Where(c=>c.Id==1);组件添加(新用户);savechanges();不幸的是。。“我试图访问公司对象上的用户列表。这不起作用。”所谓访问,我指的是用于检索和添加。因此没有属性公司。用户?然后你有一个不同的问题,你应该映射一个虚拟的。如果您使用的是代码优先的方法,请将public IEnumerable用户{get;set;}添加到公司实体,将public virtual Company{get;set;}添加到用户实体。如果首先使用DB,请确保用户表中有一个指向公司的外键,并刷新您的模式。E是一个虚拟IEnumerable用户属性,但如果我通过它添加用户,它不会改变任何内容。感谢您指出我示例代码中的一些缺陷。对于这个简单的例子,我可以使用任意一个,但如果实体存在,我最终需要对它进行更改。我更新了我的初始条目以反映您发现的缺陷。遗憾的是,错误仍然存在于我的代码中。CompanyId有时仍然设置为NULL。您可以尝试从实体上下文中获取公司,并将用户添加到公司,而不是直接将实体添加到上下文中并说其Id为1。Try:var comp=context.Companys.Where(c=>c.Id==1);组件添加(新用户);savechanges();不幸的是。。“我试图访问公司对象上的用户列表。这不起作用。”所谓访问,我指的是用于检索和添加。因此没有属性公司。用户?然后你有一个不同的问题,你应该映射一个虚拟的。如果您使用的是代码优先的方法,请将public IEnumerable用户{get;set;}添加到公司实体,将public virtual Company{get;set;}添加到用户实体。如果先使用DB,请确保用户表有一个指向company的外键,并刷新您的schemeThere是一个虚拟IEnumerable Users属性,但如果通过它添加用户,它不会改变任何内容。