【问题标题】:Error using foreign keys in entity framework在实体框架中使用外键时出错
【发布时间】:2013-05-08 19:12:55
【问题描述】:

我使用了外键

点击删除按钮后

运行 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

【问题讨论】:

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


    【解决方案1】:

    我假设您尝试删除的 T1 对象在其集合中也有 T2 对象(如您所说 我使用了外键)。所以第一个问题,delete,大概是这样解决的

    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) 而不是只显示消息框。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多