实体框架正在删除条目

本文关键字:删除 框架 实体 | 更新日期: 2023-09-27 18:07:37

我从两个页面的网页获取信息:

第一页:—创建Content c1和Translation c1。t1被创建;—创建内容c2,翻译c2。t1已创建;

第二页:—系统检测到c1已经存在,只添加c1。t2到正确的表;—系统检测到c2已经存在,只添加c2。t2到正确的表;

不知何故,在第二页上,系统重写了c1。t1 with c1。t2,数据库中只有第二个翻译可用。调试时,发现正在删除c1。t1在某个点,但我不知道为什么。

这是我的实际资料:

  • EF 4.1
  • 优先方式
  • DbContext
我有这样的POCO实体(最小化):

RegionalContent: -它类似于内容的翻译和区域信息:

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类没有什么不同,只是dbset。

一个内容有多个翻译。一个翻译有一个内容相关。翻译主键是内容指南和区域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);
        }
    }
}

实体框架正在删除条目

之后缺少一个db.SaveChanges()
db.SaveChanges();
c.RegionalInfo.Clear();
regionalcontent.Region = region;
c.RegionalInfo.Add(regionalcontent);