0

我從獲取網頁信息在兩頁:實體框架被刪除條目

第一頁: - 內容C1創建和翻譯創建c1.t1; - 內容c2創建並翻譯c2.t1創建;

第二頁: - 如果系統檢測到C1已經存在,只是增加了c1.t2到適當的表; - 系統檢測到c2已經存在,只是將c2.t2添加到適當的表中;

不知何故,在第二頁上,系統overritting c1.t1c1.t2,只有第二翻譯可用的數據庫。當debbugging時,發現它正在刪除c1.t1在某些時候,但我不明白爲什麼。

這是我的真實的東西:

  • EF 4.1
  • 代碼優先阿布羅奇
  • 的DbContext

我有這樣的POCO實體(最小):

RegionalContent : - 這就像一個關於a的轉換和區域信息內容:

public class XBLRegionalContent 
{ 
    [Key, Column(Order = 0)] 
    public string ContentId { get; set; } 

    [ForeignKey("ContentId")] 
    public virtual XBLContent Content { get; set; } 


    [Key, Column(Order = 1)] 
    public string RegionId { get; set; } 

    [ForeignKey("RegionId")] 
    public virtual XBLRegion Region { get; set; } 

    public string Name { get; set; } 
} 

內容: - 每個GUID獨特的內容:

public class XBLContent 
{ 
    #region [ Properties ] 
    /// <summary> 
    /// The GUID 
    /// </summary> 
    [Key] 
    [StringLength(36, ErrorMessage="Must have 36 characters")] 
    [Required(ErrorMessage="Must have a unique GUID")] 
    public string GUID { get; set; } 

    public string Type { get; set; } 

    public virtual ICollection<XBLRegionalContent> RegionalInfo { get; set; } 
} 

地區 - 非常簡潔明瞭:

public class XBLRegion 
{ 
    [Key] 
    [StringLength(5, ErrorMessage="ID must have 5 characters")] 
    [Required] 
    [RegularExpression(@"[a-z]{2}-[A-Z]{2}", ErrorMessage = "ID must be in ISO 639 standard")] 
    public string ID { get; set; } 

    public string Country { get; set; } 

    public string Language { get; set; } 
} 

的DbContext類有什麼不同,只是DbSets。

一個內容有很多翻譯。一個翻譯有一個相關的內容。翻譯主鍵是content guid和region id的複合詞。

我在Model中有一個類來填充數據庫並創建一個View用來顯示信息的本地列表。這樣,我只能訪問一次數據庫進行保存,並且在保存時不需要檢索信息。

這裏只有關於這個類的重要信息:

public class XBLChart : IDisposable 
{ 
    XBLContentContext db = new XBLContentContext(); 
    private string baseurl = "http://foo.bar/"; 

    public string Locale { get; private set; } 
    public string HTML { get; private set; } 
    public string URL { get; set; } 
    public ContentType Type { get; private set; } 

    public List<XBLContent> Contents { get; set; } 

    public XBLChart(ContentType type, string sort, string locale) 
    { 
     Type = type; 

     if (sort == null) 
      sort = Enum.GetName(typeof(SortBy), SortBy.OfferStartDate); 

     if (locale != null && locale.Length == 5) 
      Locale = locale; 
     else 
      Locale = "en-US"; 

     URL = baseurl + Locale + "/" + sort; 
     HTML = FeedUtils.RequestHTML(URL); 

     Contents = new List<XBLContent>(); 

     PopulateList(); 
    } 

    private void PopulateList() 
    { 
     MatchCollection itens = Regexes.ChartItems().Matches(HTML); 
     MatchCollection titulos = Regexes.ChartTitles().Matches(HTML); 

     int type = (int)Type; 
     int start = type * 12; 

     this.Title = HttpUtility.HtmlDecode(titulos[type].Groups["title"].Value); 

     if (titulos.Count < 8 && start > 1) 
     { 
      start = (type - 1) * 12; 
      type--; 
     } 

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


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

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

       db.XBLContents.Add(c); 
      } 
      else 
       c = db.XBLContents.Single(x => x.GUID == c.GUID); 

      XBLRegionalContent regionalcontent = new XBLRegionalContent(guid, Locale);     
      if (!db.XBLRegionalInfos.Any(x => x.ContentId == guid && x.RegionId == Locale)) 
      { 
       if (c.HTML == null) 
        c.PopularInfo(Locale); 

       regionalcontent.Populate(c.HTML); 
       regionalcontent.Name = HttpUtility.HtmlDecode(itens[i].Groups["name"].Value); 

       db.XBLRegionalInfos.Add(regionalcontent);      
      } 
      else 
       regionalcontent = db.XBLRegionalInfos.Single(x => x.ContentId == guid && x.RegionId == Locale); 

      db.SaveChanges(); 

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

      Contents.Add(c); 
     } 
    } 
} 

回答

2

你缺少一個分貝。SaveChanges()後

db.SaveChanges(); 

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