2011-09-01 90 views
0

我对这个错误感到愤怒,无法解决它。 请一些绝地高手帮助我。EF重复值

我试图保存trhee实体:Region,Content和RegionalContent。地区是好的,但区域内容必须与一个内容相关联,每个内容可能有许多RegionalContents(翻译)。但我总是得到一个DbUpdateException,它有一个UpdateException异常,它有一个SqlCeException异常,如下所示:

*无法插入具有相同索引的重复值。表名= XBLContents,约束名= PK_ XBLContents _000000000000001C *

我正在调试它几天,并找不到错误。请注意,我还是一个小Padawan。

这是在他们正确的表保存对象的代码:要调用SingleOrDefault当你知道1已经存在

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

是最后一行'Contents.Add(c);'correct?不应该是'db.Contents.Add(c);'? – Eranga

+0

这是正确的。这是一个本地List,可以传递给View。我填充列表在这里因为外部我没有DbContext对象。我将此列表作为IEnumerable发送到视图 programad

回答

1
  1. 。只需使用Single
  2. 我不会打电话SaveChanges到最后。
  3. 确定GUID每次都是唯一的吗?
+0

是,GUID是主键,并且每次在Content表和RegionalInfos表上都有唯一的ContentId和regionId的复合主键。这是数据库的第二遍。我通过了第一次没有问题。当我第二次通过时,我知道内容表中已经有一行具有该GUID,但RegionalInfos上没有Content + Regionid的唯一组合,因此需要为现有内容创建一个新的Regionalinfo。 – programad

+0

谢谢,我发现了错误。那db.Contents.Add(c);是来自先前编码的垃圾,其中内容“if”在RegionalContent“if”内。现在我遇到了一个与此代码不同的问题。我应该如何继续?创建一个新的问题或在这里问问? – programad