EF不更新最近添加到数据库的对象的主键

时间:2011-04-11 07:07:14

标签: c# entity-framework ado.net

我有一个表“JobOrder”,它使用正常的EF调用添加到数据库中 在我的数据库中,我将Job_Id设为主键&自动增量值,所以我不需要设置EF模型将其默认为0 但我需要在调用SaveChanges()后插入数据库的Job_Id 我尝试使用Refresh()但它不起作用,新插入的对象的Job_Id仍为0。

using (ObjContext context = new ObjContext())  
{  
    context.AddToJobOrder(order);  
    context.SaveChanges();
    context.Refresh(RefreshMode.StoreWins, order);             //TRIED THIS  
    context.Refresh(RefreshMode.StoreWins, context.JobOrder);  //TRIED THIS TOO  
}

我试过上面提到的两个电话,但我最终还是让Job_Id为0 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

在正常情况下,您不需要刷新方法。在context.SaveChanges()之后,新插入的订单必须具有正确的order.Job_id。当然,如果你有MSSQL数据库......在其他情况下,提供商可能会有一些未实现的东西,目前几乎所有主要的数据库供应商都至少拥有正常的beta版本的数据库提供商,并支持常见的EF功能。
PS网上有许多类似的问题,也有堆栈溢出问题。例如,请参阅this

答案 1 :(得分:1)

将对象添加到上下文时,SaveChanges()应正确填充ID字段。

所以试试这个,设置一个断点,你会看到主键ID设置正确。

using (ObjContext context = new ObjContext())  
{  
    context.AddToJobOrder(order);  
    context.SaveChanges();

    //Breakpoint here, and see that Job_id has been populated.
    Debug.WriteLine(order.Jod_id);
}

只有 .SaveChanges后才能设置主键,因为它必须转到数据库并找到下一个数值。

答案 2 :(得分:0)

确保在 CSDL和SSDL中将StoreGeneratedPattern属性设置为Identity。设计器仅显示CSDL属性,因此您可能需要在XML编辑器中打开它以查看和编辑SSDL,或使用同步工具(例如my add-in模型比较器对于EF4),保持DB / SSDL / CSDL同步。