3

エンティティ フレームワークを使用して 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);
}
4

2 に答える 2

1

問題の 2 つの理由を想像できます。

  • 追跡auditTypeRepository.Findなしのクエリを実行します ( を使用.AsNoTracking())
  • または、リポジトリごとにコンテキストインスタンスを使用しているため、2つの異なるコンテキストで作業しているため、対応するコンテキストにアタッチしないため、実際には重複が発生Repositoryします(コメントの行を除く) )。auditTypeRepositoryAuditTypeRepository

後者の場合は、設計を再考し、単一のコンテキスト インスタンスをリポジトリ内に作成するのではなく、すべてのリポジトリに挿入する必要があります。

于 2013-08-02T20:53:50.607 に答える
0

問題はここからだと思います:

newAudit.AuditType = auditTypeRepository.Find(model.SelectedAuditTypeId);

次のように変更します。

newAudit.AuditTypeId = model.SelectedAuditTypeId;
于 2013-08-03T07:39:25.310 に答える