Entity Framework удаляет запись - PullRequest
       2

Entity Framework удаляет запись

0 голосов
/ 02 сентября 2011

Я получаю информацию с веб-страницы на двух страницах:

Первая страница: - Создан контент c1 и создан перевод c1.t1 ; - Создано содержимое c2 и создан перевод c2.t1 ;

Вторая страница: - Система обнаруживает, что c1 уже существует, и просто добавляет c1.t2 к соответствующей таблице; - Система обнаруживает, что c2 уже существует, и просто добавляет c2.t2 к соответствующей таблице;

Каким-то образом на второй странице система перезаписывает c1.t1 на c1.t2 , и в базе данных доступен только второй перевод. При отладке обнаружил, что в какой-то момент он удаляет c1.t1 , но я не мог понять почему.

Это мои настоящие вещи:

  • EF 4.1
  • Code-First Aproach
  • DbContext

У меня есть POCO Entities (свернуто):

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 не имеет ничего другого, только DbSets.

Один контент имеет много переводов. Один перевод связан с одним контентом. Первичный ключ перевода представляет собой составную часть guid и 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);
        }
    }
}

1 Ответ

2 голосов
/ 02 сентября 2011

вам не хватает db.SaveChanges () после

db.SaveChanges();

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