エンティティ フレームワークを使用して MVC コントローラー メソッドに新しいレコードを追加しようとしています。「InsertOrUpdate」を使用したところ、監査タイプが重複しました。関連オブジェクトを含むレコードを追加する Entity Frameworkからの回答に基づいて、かなり早く修正したいと考えていました。これは私が今持っているコードです:
コントローラ:
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);
}