簡體   English   中英

實體框架6.0更新項目列表在數據庫中創建新記錄

[英]Entity Framework 6.0 updating List of items creates new records in the Database

以下是實體類,以使人們對關系有更多的了解:

public class EmployeeCv : UserEntity
    {
    public byte ProfileImage { get; set; }
    public virtual List<Header> Headers { get; set; }

    public virtual List<ProjectExperience> ProjectExperiences { get; set; }
    public virtual List<Tag> Tags { get; set; } //many to many relationship between employeeCv and tags

    [NotMapped]
    public List<TagsByTypes> TagsbyTypes
    {
        get
        {
            List<TagsByTypes> ListOfTagTypes = new List<TagsByTypes>();
            if (Tags != null)
            {
               var GroupedList = Tags.GroupBy(x => x.TagType.Title).ToList().Select(grp => grp.ToList());
               foreach (var currentItem in GroupedList)
               {
                    var TagType = new TagsByTypes()
                    {
                        Title = currentItem.FirstOrDefault().TagType.Title,
                        Tags = currentItem
                    };
                    ListOfTagTypes.Add(TagType);

               }
                return ListOfTagTypes;                         
            }
            else
                return null;
        }
    }
}

public class Tag : AuditableEntity<int>
    {
    public string Title { get; set; }
    public virtual List<EmployeeCv> EmployeeCv { get; set; }

    public virtual TagType TagType { get; set; }
    //To post Id's Not added to the database
    [NotMapped]
    public int TagTypeId { get; set; }
    [NotMapped]
    public int EmployeeCv_Id { get; set; }
}
public class TagType : AuditableEntity<int>
{
    public string Title { get; set; }
    public virtual List<Tag> Tags { get; set; }
}

我正在寫一個函數,根據現有標簽類型將新標簽添加到employeeCv中。 我已經有了工作單元和存儲庫設置,可以在數據庫中添加/更新/刪除記錄。 這是我的實現:

        public void UpdateEmployeeCVWithTag(Tag tag)
        {
            using (var repository = new UnitOfWork<EmployeeCv>().Repository)
            {
                var EmployeeCv = repository.GetSingleIncluding(tag.EmployeeCv_Id,
                   x => x.Headers, x => x.Tags,
                   x => x.ProjectExperiences,
                   x => x.ProjectExperiences.Select(p => p.AssociatedProject),
                   x => x.ProjectExperiences.Select(p => p.ProjectSkills));
                //x => x.ProjectExperiences.Select(p => p.ProjectSkillTags.Select(s => s.AssociatedSkill)));
                //tag.TagType = EmployeeCv;


                    var repositoryTagType = new UnitOfWork<TagType>().Repository;
                    var tagtype = repositoryTagType.GetItemById(tag.TagTypeId);
                    tag.TagType = tagtype; //even after assignment new tagtype is creating everytime code runs
                    //repositoryTag.UpdateItem(tagtype);
                    EmployeeCv.Tags.Add(tag);
                    //EmployeeCv.ProjectExperiences[projectId - 1].ProjectSkills.Add(tag);
                    repository.UpdateItem(EmployeeCv);

            }
        }

除一個問題外,此功能正常工作。 它正在數據庫中創建一個新的TagType,並忽略已經存在的TagType。 下面是存儲庫類中的updateItem代碼:

public virtual void UpdateItem(TEntity entityToUpdate)
        {
            var auditableEntity = entityToUpdate as IAuditableEntity;
            if (auditableEntity != null)
            {
                auditableEntity.UpdatedDate = DateTime.Now;
            }
            //_context
            //Attach(entityToUpdate);
            _context.Entry(entityToUpdate).State = EntityState.Modified;
            _context.SaveChanges();
        }

我沒有看到全部功能的猜測是,您為此使用了不同的上下文。

您應該更新外鍵而不是整個對象,因此,由於已經設置了tagTypeId,因此無需添加整個TagType對象。 外鍵應按原樣工作。

請查看此鏈接以獲取更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM