0

外部キーを使用しました

削除ボタンをクリックした後

MessageBox.Show("Error"); を実行します。

外部キーなので

削除ボタンをクリックした後

テーブルを挿入したくない

再び同じエラーが発生し、削除します

テーブルを挿入または更新できません

再び同じエラーが発生し、削除します

問題の解決方法

コード削除

private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            int del = Convert.ToInt32(dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0].Value);

            T1 query = (from p in db.T1 where p.id == del select p).FirstOrDefault();

            db.T1.Remove(query);
            db.SaveChanges();
            fill();
        }
        catch
        {

            MessageBox.Show("Error");
        }

    }

コード挿入

try
        {


            db.T1.Add(new T1()
                {
                    names=textBox1.Text
                });
            db.SaveChanges();
            //fill();
        }
        catch
        {

            MessageBox.Show("Error");
        }

クラスコードが最初

public partial class T1
{
    public T1()
    {
        this.T2 = new List<T2>();
    }

    public int id { get; set; }
    public string names { get; set; }
    public virtual ICollection<T2> T2 { get; set; }
}

public partial class T2
{
    public int Id { get; set; }
    public Nullable<int> fname { get; set; }
    public virtual T1 T1 { get; set; }
}

SQL セットアップ http://sarbandi.ir/keramati/SQLPackage.exe

コード例 http://sarbandi.ir/keramati/exaample.rar

4

1 に答える 1

0

T1削除しようとしているオブジェクトのコレクションにもオブジェクトがあると思います(外部キーを使用したT2と言うように)。したがって、最初の問題である削除は、おそらく次の方法で解決されます

T1 t1 = db.T1.FirstOrDefault(p => p.id == del);
   // Same as your code, just other syntax, or: db.T1.Find(del);

foreach(var t2 in t1.T2.ToList())
{
    db.T2.Remove(t2);
}
db.T1.Remove(t1);

db.SaveChanges();

2 番目のエラーは、インスタンスが 1 つしかないことが原因である可能性がありDbContextます ( db)。2 回目に保存しようとすると、db以前に失敗した削除をコミットするための 2 回目の試みが行われますが、それはまだそこにあります。(飲み込む代わりに例外をキャッチする場合は、これを確認できます)。削除アクションと挿入アクションはそれぞれ、usingコンストラクトで新しく作成した独自のコンテキスト インスタンスを使用する必要があります。

using(var db = new MyContext())
{
    // do stuff.
}

補足:

  • これが単なる演習以上のものであることが意図されている場合は、UI とデータ ロジックを分離してみてください。
  • 例外をキャッチします:catch(Exception exception)メッセージボックスを表示するだけではありません。

(私はあなたのリンクを見ていないことを認めなければなりません。これがあなたを正しい軌道に乗せることを願っています)。

于 2013-05-08T20:19:01.667 に答える