none
使用EF,删除之后再新增同样的主键,catch到错误,提示已存在

    问题

  • A表的主键是Code nvarchar(30)。我添加了一个Code=004,然后通过EF物理删除成功了,在数据库确实不存在主键为004的记录了,

    但是当我使用EF再次插入主键为004的实体时,EF老是提示该实体已经存在了,很郁闷,插入非004的就可以成功。难道是删除之后,需要手动更新一下数据库上下文?感觉数据库上下文,还不知道该条记录被删除了,一直认为记录是存在的。

    2016年5月26日 3:05

答案

  • 有两种模式,参考一下这里的代码

    http://www.entityframeworktutorial.net/delete-entity-in-entity-framework.aspx

    Connected scenario:

    using (var ctx = newSchoolDBContext()) { var stud = (from s in ctx.Students where s.StudentName == "Student1" select s).FirstOrDefault(); ctx.Students.DeleteObject(stud); int num = ctx.SaveChanges(); }

    Disconnected scenario:

    Student stud = null;

    using (SchoolDBContext ctx = new SchoolDBContext())
    {
        stud = (from s in ctx.Students
                where s.StudentName == "Student1"
                    select s).FirstOrDefault();
    }

    using (SchoolDBContext newCtx = new SchoolDBContext())
    {
        newCtx.Students.Attach(stud);
        newCtx.Students.DeleteObject(stud);
        //you can use ObjectStateManager also
        //newCtx.ObjectStateManager.ChangeObjectState(stud,
                                System.Data.EntityState.Deleted);

        int num = newCtx.SaveChanges();
    }


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年5月26日 16:20
  • 还有一种可能是dbcontext的原因,参考这个模式来实现

    using (TransactionScope scope = new TransactionScope())
    {
        //Do something with context1
        //Do something with context2

        //Save Changes but don't discard yet
        context1.SaveChanges(false);

        //Save Changes but don't discard yet
        context2.SaveChanges(false);

        //if we get here things are looking good.
        scope.Complete();
        context1.AcceptAllChanges();
        context2.AcceptAllChanges();

    }


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年5月26日 16:30

全部回复

  • 有两种模式,参考一下这里的代码

    http://www.entityframeworktutorial.net/delete-entity-in-entity-framework.aspx

    Connected scenario:

    using (var ctx = newSchoolDBContext()) { var stud = (from s in ctx.Students where s.StudentName == "Student1" select s).FirstOrDefault(); ctx.Students.DeleteObject(stud); int num = ctx.SaveChanges(); }

    Disconnected scenario:

    Student stud = null;

    using (SchoolDBContext ctx = new SchoolDBContext())
    {
        stud = (from s in ctx.Students
                where s.StudentName == "Student1"
                    select s).FirstOrDefault();
    }

    using (SchoolDBContext newCtx = new SchoolDBContext())
    {
        newCtx.Students.Attach(stud);
        newCtx.Students.DeleteObject(stud);
        //you can use ObjectStateManager also
        //newCtx.ObjectStateManager.ChangeObjectState(stud,
                                System.Data.EntityState.Deleted);

        int num = newCtx.SaveChanges();
    }


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年5月26日 16:20
  • 还有一种可能是dbcontext的原因,参考这个模式来实现

    using (TransactionScope scope = new TransactionScope())
    {
        //Do something with context1
        //Do something with context2

        //Save Changes but don't discard yet
        context1.SaveChanges(false);

        //Save Changes but don't discard yet
        context2.SaveChanges(false);

        //if we get here things are looking good.
        scope.Complete();
        context1.AcceptAllChanges();
        context2.AcceptAllChanges();

    }


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年5月26日 16:30
  • 感谢您的回答,晚上试一下,
    2016年5月30日 1:31
  • 感谢您的回答,晚上试一下~这两天忙,没及时回复很抱歉~
    2016年5月30日 1:33
  • 这两天忙,没及时回复很抱歉~
    2016年5月30日 1:33