C# 无法添加密钥已在使用的实体更新操作
我正在创建一个小应用程序,在这个应用程序中,我使用LINQtoSQL来执行对数据库的所有操作 现在,我给我的数据库结构的一小部分,请看一看 所以更新语言细节我使用datacontext获取登录对象,类似这样的东西C# 无法添加密钥已在使用的实体更新操作,c#,linq-to-sql,C#,Linq To Sql,我正在创建一个小应用程序,在这个应用程序中,我使用LINQtoSQL来执行对数据库的所有操作 现在,我给我的数据库结构的一小部分,请看一看 所以更新语言细节我使用datacontext获取登录对象,类似这样的东西 XVDataContext Context = new XVDataContext (); var myQuery = from objLogIn in Context.GetTable<LogIn>() where objLogIn.Emp_Id == nEmpId
XVDataContext Context = new XVDataContext ();
var myQuery = from objLogIn in Context.GetTable<LogIn>() where objLogIn.Emp_Id == nEmpId select objLogIn;
我已经阅读了以下链接
通过阅读上面的链接,我发现我在ID字段中犯了一些错误,但仍然无法解决
请告诉我对提出这个问题的清楚理解,以及我如何解决这个问题
编辑:
我只想更新LanguageDetail表。
当我尝试使用下面的代码添加新对象时,它仍然抛出异常
objUser.LanguageDetail.Add(obj);
据我所知,您希望更新数据库中的LanguageDetail实体。为此,您必须执行以下操作之一:
Context.LanguageDetails.Attach(obj);
objUser.Employee_LanguageDetails[0] = obj;
您可能希望使用以下代码为特定用户添加/删除语言
LogIn objUser = myQuery.First<LogIn>();
var languages = TextBoxLanguagesKnown.Text.Split('\n');
// Removes deleted languages (first find all language details that are missing from the UI).
var deletedLanguages = objUser.LanguageDetails.Where(ld => !languages
.Any(l => ld.Language == l.Trim())).ToArray();
foreach(var deletedLanguage in deletedLanguages)
{
objUser.LanguageDetails.Remove(deletedLanguage);
Context.LanguageDetails.DeleteOnSubmit(deletedLanguage);
}
// Adds new languages (then adds new language details that are not found in the database).
var newLanguages = languages.Where(l => !objUser.LanguageDetails
.Any(ld => ld.Language == l.Trim())).ToArray();
foreach (string newLanguage in newLanguages)
{
var languageDetail = new LanguageDetail
{
Emp_Id = objUser.Emp_Id,
Language = newLanguage.Trim()
};
objUser.LanguageDetails.Add(languageDetail);
}
Context.SubmitChanges();
我认为您的解决方案可能是正确的,但在我的代码中,我得到了相同的异常。忘记上面的代码吧,如果可能的话,给我一个简单的例子,如何使用您自己的代码更新LanguageDetail表。当我尝试您的代码时,它抛出“InvalidOperationException”原因:-EntitySet在枚举过程中被修改。在第一个foreach循环中,它再次抛出异常“InvalidOperationException”原因:“试图删除登录名和LanguageDetail之间的关系。但是,该关系的一个foregin键LanguageDetail.Emp_Id不能设置为null。”@NiravKamani,添加了
Context.GetTable().remove(deletedLanguage)
,将GetTable
更改为上下文“context.GetTable().Remove(deletedLanguage);”中设置的语言详细信息。Remove方法不可用。上下文中是否存在LanguageDetails
?我将GetTable()
更改为LanguageDetails
var languages = TextBoxLanguagesKnown.Text.Split('\n');
// Removes deleted languages (first find all language details that are missing from the UI).
var deletedLanguages = objUser.LanguageDetails.Where(ld => !languages
.Any(l => ld.Language == l.Trim())).ToArray();
foreach(var deletedLanguage in deletedLanguages)
{
objUser.LanguageDetails.Remove(deletedLanguage);
Context.LanguageDetails.DeleteOnSubmit(deletedLanguage);
}
// Adds new languages (then adds new language details that are not found in the database).
var newLanguages = languages.Where(l => !objUser.LanguageDetails
.Any(ld => ld.Language == l.Trim())).ToArray();
foreach (string newLanguage in newLanguages)
{
var languageDetail = new LanguageDetail
{
Emp_Id = objUser.Emp_Id,
Language = newLanguage.Trim()
};
objUser.LanguageDetails.Add(languageDetail);
}
Context.SubmitChanges();