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/examample.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();

第二个错误可能是由于您有一个DbContext实例 ( db) 造成的。您第二次尝试保存时,db会再次尝试提交之前失败的删除,但仍然存在。(如果你捕捉到异常而不是吞下它,你可以确认这一点)。您的删除和插入操作应各自使用您在using构造中新建的上下文实例:

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

旁注:

  • 如果这不仅仅是一些练习,请尝试分离 UI 和数据逻辑。
  • 捕获异常:catch(Exception exception)而不仅仅是显示一个消息框。

(我必须承认我没有看你的链接,我希望这会让你走上正轨)。

于 2013-05-08T20:19:01.667 回答