在实体框架中使用外键时出错

时间:2013-05-08 19:12:55

标签: entity-framework c#-4.0 entity-framework-4 ef-code-first entity-framework-4.1

我使用了外键

点击删除按钮后

运行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 setup http://sarbandi.ir/keramati/SQLPackage.exe

代码示例 http://sarbandi.ir/keramati/examample.rar

1 个答案:

答案 0 :(得分: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)而不只是显示消息框。

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