0

私はMVCを初めて使用し、マスター詳細形式でレコードを追加/編集しようとしています。masteridとdetailidはどちらも、レコードの挿入時にOracleによって生成されます。したがって、DBContext.SaveChanges()を呼び出そうとすると、外部キーに違反し、IDが「0」のプライマリ行が見つからないというエラーが発生します。

以下はクラスの説明です。

public class Master
{
    public int MasterID { get; set; }
    public string MasterTitle { get; set; }
    public virtual IList<Detail> Details { get; set; }
}

public class Detail
{
    public int DetailID { get; set; }
    public int MasterID { get; set; }

    public string DetailName { get; set; }
    public virtual Master Master { get; set; }
}

コントローラコード

[HttpPost]
  public ActionResult Create(MASTER masterrecord)
{
   if (ModelState.IsValid)
   {
      db.MASTER.Add(masterrecord);
      db.SaveChanges();
    }
    ...
}

主キー(masterid)は、レコードがデータベースに挿入された後にのみ意味のある値を取得します。この時点でcontext.SaveChanges()は、「0」masteridを使用してクライアントレコードも保存しようとします。役に立つものが見つからなかったところをすべて検索しました。

最初にMasterテーブルのみを保存して、masteridを取得し、DETAILモデルで使用できるようにします。ただし、EF5 MVC ASP.NETを使用してそれを行う方法をどこにも見つけることができませんでした。作業サンプルを提供する正しい方向を誰かに教えてもらえますか?ありがとうSiddhant

4

2 に答える 2

0

PK に int ではなく GUID を使用することを検討してください。次に、Master のコンストラクターで、 と言うことができますMasterID = Guid.NewGuid();。こうすれば、次の ID を調べるためにデータベースにアクセスする必要がなくなります。

ここに賛否両論のリストがあります http://www.codinghorror.com/blog/2007/03/primary-keys-ids-versus-guids.html

于 2013-01-19T00:12:08.037 に答える
0

Create メソッドにブレークポイントを設定し、Master オブジェクトで適切なリストを取得している場合は、Oracle プロバイダに問題がある可能性があります。

回避策として、次のようにメソッド シグネチャを変更してデータを受け入れることができます。

public ActionResult Create(MASTER masterrecord, List<Detail> details)

次に、最初に を保存してmasterrecordから、詳細を追加して再度保存します。最適ではありませんが、うまくいくかもしれません。

補足: IList を ICollection に変更してください。

于 2013-01-18T15:52:41.663 に答える