C# 无法添加密钥已在使用的实体更新操作

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

我正在创建一个小应用程序,在这个应用程序中,我使用LINQtoSQL来执行对数据库的所有操作

现在,我给我的数据库结构的一小部分,请看一看

所以更新语言细节我使用datacontext获取登录对象,类似这样的东西

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实体。为此,您必须执行以下操作之一:

  • 根据原始LanguageDetail对象的id检索该对象,并更新该对象,而不是创建新对象并为其分配现有对象的id
  • 将新创建的对象附加到您的上下文中,而不只是将其引用到LanguageDetails集合中。 出现这种异常是因为linqtosql的行为方式是它威胁要插入的新对象obj,因此它试图将其插入到language details表中
  • 这样修改代码应该可以:

    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();