实体框架 6.0 更新项列表会在数据库中创建新记录

本文关键字:数据库 创建 新记录 列表 框架 更新 实体 | 更新日期: 2023-09-27 18:35:53

以下是实体类,以便更好地理解关系:

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。以下是我在存储库类中的更新项代码:

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();
        }

实体框架 6.0 更新项列表会在数据库中创建新记录

在没有看到完整功能的情况下,我的猜测是你为此使用了不同的上下文。

您应该更新外键而不是整个对象,因此无需添加整个 TagType 对象,因为 tagTypeId 已经设置好了。外键应按原样工作。

请查看此链接以获取更多信息。