Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架6:添加到子集合_Entity Framework_Ef Code First_Entity Framework 6 - Fatal编程技术网

Entity framework 实体框架6:添加到子集合

Entity framework 实体框架6:添加到子集合,entity-framework,ef-code-first,entity-framework-6,Entity Framework,Ef Code First,Entity Framework 6,我首先使用的是EF6代码。我有一个父实体费用,它有子实体标签的集合。实体是 public class Expense : Entity { //public Expense() //{ // this.Tags = new HashSet<Tag>(); //} public string Title { get; set; } public ICollection<Tag> Tags { get; set; }

我首先使用的是EF6代码。我有一个父实体费用,它有子实体标签的集合。实体是

 public class Expense : Entity
{
    //public Expense()
    //{
    //    this.Tags = new HashSet<Tag>();
    //}
    public string Title { get; set; }
    public ICollection<Tag> Tags { get; set; }

    //public long TagId { get; set; }
    public decimal Amount { get; set; }

    public long ByUserId { get; set; }
    public User ByUser { get; set; }

    public long? ForUserId { get; set; }
    public User ForUser { get; set; }

    public DateTime ExpenseDate { get; set; }
}

 public class Tag : Entity
{
    public Tag()
    {
        this.Expenses = new HashSet<Expense>();
    }
    public string Name { get; set; }

    public virtual ICollection<Expense> Expenses { get; set; }

    public long OrganizationId { get; set; }

    public Organization Organization { get; set; }
}
我拯救实体的方式

var tags = new List<Tag>();
        foreach (var item in expense.Tags)
        {
            var tag = _TagHandler.Get().Where(x => x.Id == item.Id).FirstOrDefault();
            tags.Add(tag);
        }

        entity.Tags.Clear();
        foreach (var item in tags)
        {
            expense.Tags.Add(item);
        }

if (expense.Id == 0)
        {
            entity.CreatedDate = DateTime.UtcNow;
            entity.UpdatedDate = DateTime.UtcNow;
            updated = EntityRepository.Add(entity);
        }
        else
        {
            expense.UpdatedDate = DateTime.UtcNow;
            updated = EntityRepository.Update(entity);
        }
        UnitOfWork.Commit();
当我创建费用时,我向其中添加了多个标记,并且它成功地保存在tblExpenseTags中,但问题是当我向费用添加新标记时,它们没有保存到tblExpenseTags表中。我使用sql探查器查看将对sql数据库进行哪些调用,但在更新时没有看到任何insert调用


请告诉我我做错了什么?

实际上,您所做的是通过获取与expense.Tags中的所有标记具有相同Id的相应标记实例来修改expense.Tags中的现有标记,然后清除expense.Tags并将每个新标记添加到expense.Tags中。这意味着如果expense.Tags没有项目,则不会添加任何标记。如果它有一些项目,那么expense.Tags将具有相同的标签,具有相同的Id,但可能具有一些修改的属性。这取决于_TagHandler.Get解析标记的方式。我怀疑它可能只是从db加载所有标签。所以事实上标签没有任何变化。是的,它加载了所有的标签。在从db加载之前,流程是费用实体拥有所有标记,标记只有ID new和old。当我加载标签时,我匹配标签ID并将标签对象附加到费用。因此,它会附加旧标记对象和新标记对象。然后我保存它。我希望这能澄清你的疑问?我所说的正是你所做的。在你的最终标签中不会有新的和旧的。在全部清除之后,只有新的一个,但正如我所说的,所有这些新的都有一个一个地匹配所有清除的Id。因此,从技术上讲,这就像删除所有内容,然后重新添加所有内容。这里唯一的一点是,新的可能会根据_TagHandler.Get修改一些属性。如果没有任何修改,那么您将看到标签中没有任何更改,没有添加或删除以及修改。那么,您建议我如何添加或删除标签到费用中?
var tags = new List<Tag>();
        foreach (var item in expense.Tags)
        {
            var tag = _TagHandler.Get().Where(x => x.Id == item.Id).FirstOrDefault();
            tags.Add(tag);
        }

        entity.Tags.Clear();
        foreach (var item in tags)
        {
            expense.Tags.Add(item);
        }

if (expense.Id == 0)
        {
            entity.CreatedDate = DateTime.UtcNow;
            entity.UpdatedDate = DateTime.UtcNow;
            updated = EntityRepository.Add(entity);
        }
        else
        {
            expense.UpdatedDate = DateTime.UtcNow;
            updated = EntityRepository.Update(entity);
        }
        UnitOfWork.Commit();