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

时间:2014-08-18 08:12:27

标签: c# linq-to-sql

我正在创建一个小应用程序,其中我使用LINQ To SQL对数据库执行所有操作。

现在我在这里给出我数据库结构的一小部分,请看一下。

enter image description here

所以更新语言细节我正在使用像这样的datacontext获取登录对象。

XVDataContext Context = new XVDataContext ();

var myQuery = from objLogIn in Context.GetTable<LogIn>() where objLogIn.Emp_Id == nEmpId select objLogIn;

在nEmpId中,我总会有一些价值。

因此,实际上我没有创建任何问题我从DB获取所需的记录并使用以下代码将其存储在objUser对象中。

LogIn objUser = myQuery.First<LogIn>();

现在更新LanguageDetail我正在执行以下代码,但是当我执行SubmitChanges行时它会抛出异常。

enter image description here

这是我正在执行更新的代码。

LanguageDetail obj = new LanguageDetail();
foreach (string sLanguages in TextBoxLanguagesKnown.Text.Split('\n'))
{
       obj.Emp_Id = objUser.Emp_Id;
       obj.Language = sLanguages.Trim();
}
objUser.LanguageDetails[0] = obj;

Context.SubmitChanges();

我已阅读以下链接。

cannot add an entity with a key that is already in use

LINQ To SQL exception with Attach(): Cannot add an entity with a key that is alredy in use

Cannot add an entity with a key that is already in use (LINQ)

通过阅读上述链接,我发现我在ID字段中犯了一些错误,但仍然无法解决。

请告诉我对提出此问题的明确理解,以及如何解决此问题。

修改

我只是想更新LanguageDetail表。

当我尝试使用以下代码添加新对象时,它仍会抛出异常。

objUser.LanguageDetail.Add(obj);

2 个答案:

答案 0 :(得分:1)

根据我的理解,您希望更新数据库中的LanguageDetail实体。为此,您必须执行以下操作之一:

  1. 根据其id检索原始LanguageDetail对象,并更新该对象,而不是创建新对象并为其指定现有对象的id。
  2. 将新创建的对象附加到您的上下文,而不是仅仅将其引用到您的LanguageDetails集合。 您看到的异常发生是因为linq to sql的行为方式是它将obj威胁为您要插入的新对象,因此它会尝试将其插入语言详细信息表中。
  3. 修改你的代码应该有效:

    Context.LanguageDetails.Attach(obj);
    objUser.Employee_LanguageDetails[0] = obj;
    

答案 1 :(得分:1)

您可能希望使用以下代码为特定用户添加/删除语言。

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