Entity framework 实体框架6:添加到子集合
我首先使用的是EF6代码。我有一个父实体费用,它有子实体标签的集合。实体是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; }
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();