gpt4 book ai didi

asp.net-mvc - 使用 Entity Framework 添加记录重复其他对象

转载 作者:行者123 更新时间:2023-12-04 19:59:42 25 4
gpt4 key购买 nike

我正在尝试使用 Entity Framework 在 MVC Controller 方法中添加新记录。当我刚刚使用“InsertOrUpdate”时,审计类型重复了。基于 Entity Framework adding record with a related object 的回答我希望很快就能修好它。这是我现在的代码:

Controller :

if (ModelState.IsValid)
{
Audit newAudit = Factory.GetNew();
newAudit.Name = model.Name;
newAudit.Deadline = model.Deadline;
newAudit.AuditType = auditTypeRepository.Find(model.SelectedAuditTypeId);

Repository.InsertOrUpdate(newAudit);
Repository.Save();

return RedirectToAction(MVC.Audits.Details(newAudit.Id));
}

存储库:

public override void InsertOrUpdate(Qdsa.WebApplications.AuditMaster.Data.Audit model)
{
if (model.Id == default(int))
{
// New entity
context.Audits.Add(model);
}
else
{
// Existing entity
model.ModifiedOn = DateTime.Now;
context.Entry(model).State = EntityState.Modified;
}
//If I leave out the code below the AuditType will be duplicated
if (model.AuditType != null)
{
context.Entry<AuditType>(model.AuditType).State = EntityState.Unchanged;
}
}

public virtual void Save()
{
context.SaveChanges();
}

所以我想我解决了这个问题。但是,AuditType 也有 Child 对象。现在这些子对象被复制了。添加具有已存在子对象的实体的正确方法是什么?因为 AuditType 是必需的,所以我不能先保存它,然后再更新它。有什么建议吗?

更新:AuditRepostory 和 AuditTypeRepository 都继承自 BaseRepository,它的上下文如下:

protected DBContext context = new DBContext ();

public virtual T Find(int id)
{
return All.SingleOrDefault(s => s.Id == id);
}

最佳答案

我可以想象这个问题有两个原因:

  • auditTypeRepository.Find 执行无跟踪查询(使用 .AsNoTracking())
  • 或者您正在为每个存储库使用一个上下文实例,因此 RepositoryauditTypeRepository 正在使用两个不同的上下文,这确实会导致 重复AuditType 因为您没有将它附加到与 Repository 对应的上下文(除了您的评论行)。

如果是后者,您应该重新考虑您的设计并将单个上下文实例注入(inject)所有存储库,而不是在存储库内部创建它。

关于asp.net-mvc - 使用 Entity Framework 添加记录重复其他对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17980337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com