C# EntityFramework 4.1,context.Entities.Add有时会将FK设置为NULL
我有一个奇怪的问题,这个问题已经持续了好几个小时 我的主要问题是: 添加实体时,什么可能导致EF 4.1代码首先将外键设置为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
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(),但没有任何更改
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属性,但如果通过它添加用户,它不会改变任何内容。