实体框架设置ID时不应该

时间:2012-07-30 21:05:48

标签: c# .net entity-framework orm entity-framework-4.1

我有以下实体模型:

Entity Model

我添加了一堆任务并开始处理这些任务。每个任务完成后,我想记录有关它的信息。

我使用以下代码执行此操作:

TASK scheduledTask = entities.TASKs.First(x => x.TASK_NAME == e.ClassName);
scheduledTask.NEXT_RUN = e.NextRun;
entities.SaveChanges();

TASK_LOG logMsg = new TASK_LOG()
{
    TASK = scheduledTask,
    MESSAGE = e.TaskResult.Message,
    STATUS = e.TaskResult.Status ? "Successful" : "Failure",
    TIMESTAMP = e.CompletedTime
};
entities.TASK_LOG.AddObject(logMsg);
entities.SaveChanges();

但是,我收到一个异常,说明我无法修改TASK_LOG对象的ID属性。我没有看到我的代码将如何修改logMsg对象ID属性。

注意:两个实体中的ID属性由数据库生成,并设置为StoreGeneratedPattern - Identity。

修改

第二次运行 - 现在我收到有关在第一次SaveChanges电话上打开/启用连接的错误。

第3次运行 - 获取错误存储更新,插入或删除语句会影响意外的行数(0)。在最后一次SaveChanges电话会议上。

这种错误的不一致使得很难修复。

1 个答案:

答案 0 :(得分:0)

我怀疑问题可能是因为您在通过AddObject附加到上下文之前设置了logMsg.TASK属性。由于您可以访问外键,因此我建议使用TASK_ID属性而不是TASK导航属性创建引用。请尝试将此代码替换为logMsg:

TASK_LOG logMsg = new TASK_LOG()
{
    TASK_ID = scheduledTask.ID,
    MESSAGE = e.TaskResult.Message,
    STATUS = e.TaskResult.Status ? "Successful" : "Failure",
    TIMESTAMP = e.CompletedTime
};