EF Дублированная стоимость - PullRequest
0 голосов
/ 01 сентября 2011

Я злюсь на эту ошибку и не могу ее исправить. Пожалуйста, помогите мне немного мастера-джедая.

Я пытаюсь сохранить сущности: Регион, Контент и Региональный контент. Регион в порядке, но региональный контент должен быть связан с одним контентом, и каждый контент может иметь много региональных контентов (переводов). Но я всегда получаю DbUpdateException, у которого есть UpdateException, у которого есть SqlCeException, который говорит что-то вроде:

* Невозможно вставить дублированное значение с тем же индексом. Имя таблицы = XBLContents, Имя ограничения = PK_ XBLContents _000000000000001C *

Я отлаживаю его несколько дней и не могу найти ошибку. Пожалуйста, обратите внимание, что я все еще маленький падаван.

Это код, который сохраняет объекты в соответствующих таблицах:

Region region;
if (!db.Regions.Any(x => x.ID == Locale))
{
    region = new Region { ID = Locale };
    db.Regions.Add(region);
    db.SaveChanges();
}
else
    region = db.Regions.SingleOrDefault(x => x.ID == Locale);

for (int i = start; i < (start + 2); i++)
{
    string guid = itens[i].Groups["guid"].Value;

    Content c = new Content(guid);
    if (!db.Contents.Any(x => x.GUID == guid))
    {
        c.Type = Type.ToString();
        c.PopularInfo(Locale);

        db.Contents.Add(c);
    }
    else
        c = db.Contents.SingleOrDefault(x => x.GUID == c.GUID);

    RegionalContent regionalcontent;                
    if (!db.RegionalInfos.Any(x => x.ContentId == guid && x.RegionId == Locale))
    {


        if (c.HTML == null)
            c.PopularInfo(Locale);

        regionalcontent = new RegionalContent(c, Locale);
        regionalcontent.Region = region;
        regionalcontent.Name = HttpUtility.HtmlDecode(itens[i].Groups["name"].Value);

        db.RegionalInfos.Add(regionalcontent);

        db.Contents.Add(c);
        db.SaveChanges();
    }
    else
        regionalcontent = db.RegionalInfos.SingleOrDefault(x => x.ContentId == guid && x.RegionId == Locale);

    c.RegionalInfo.Clear();
    regionalcontent.Region = region;
    c.RegionalInfo.Add(regionalcontent);

    Contents.Add(c);
}

1 Ответ

1 голос
/ 01 сентября 2011
  1. Вы звоните SingleOrDefault, когда знаете, что 1 уже существует.Просто используйте Single.
  2. Я бы не назвал SaveChanges до самого конца.
  3. Вы уверены, что GUID каждый раз уникален?
...