我只是使用find()方法加载页面,该方法返回一条记录作为摘要显示,我的viewmodel还返回一个我称之为指标的列表,以便客户可以直观地识别他们用于项目的指标。如果他们没有使用这些指标,那么他们可以将值更新为零。更新指标后,他们会单击“保存”将这些指标插入表中。因此,我们发现我最初从度量表中提取了度量标准,其中status ='Planned'用于计划度量标准。当他们将这些指标加载到页面中时,如果需要,这些指标将使用新值进行更新,然后重新插入状态为“实际”的新行。
原始计划指标记录 - metricid = 1,metricstatus ='已计划' 新的实际metircs记录 - 插入前没有id,metricstatus ='Actual'
插入过程中出现以下错误。
ObjectStateManager中已存在具有相同键的对象。 ObjectStateManager无法使用相同的键跟踪多个对象。这是我插入记录的方式
IList<Metric> MetricList = new List<Metric>();
foreach (var projectMetric in ProjectMetrics){
if (projectMetric.MetricTypeId != 0)
{
var metric = new Metric
{
Value = Int32.Parse(projectMetric.Value),
MetricTypeId = projectMetric.MetricTypeId,
ProjectId = project.ProjectId,
MetricPhase = "Actual"
};
project.Metrics.Add(metric);
}
}
这是我保存更改的方式
this.Context.Projects.Attach(project);
this.Context.Entry(project).State = System.Data.EntityState.Modified;
this.Context.SaveChanges();
非常感谢任何帮助。
public Project GetProjectByID(int? id)
{
Project ProjectQuery = Context.Projects.Find(id);
return ProjectQuery;
}
我实际上将json字符串发送回具有所有指标的服务器。我按如下方式反序列化我的json字符串:
List InsertableProjectMetrics = JsonConvert.DeserializeObject>(metricsJSON);
然后我调用InsertMetricMethod,它循环遍历Jason度量数据。
public void InsertProjectMetrics(List ProjectMetrics, int projectid, ref Project project, string Status)
{
//Insert Record: Insert New Record
try
{
this.Context.Projects.Attach(project);
foreach (var projectMetric in ProjectMetrics)
{
if (projectMetric.MetricTypeId != 0)
{
var metric = new Metric
{
Value = Int32.Parse(projectMetric.Value),
MetricTypeId = projectMetric.MetricTypeId,
ProjectId = project.ProjectId,
MetricPhase = "Actual"
};
project.Metrics.Add(metric);
}
}
答案 0 :(得分:1)
遇到此错误时,请查看以下提及内容:
RequestId = Guid.NewGuid();
尽管使用sql function newid()
在插入存储过程中填充了主键,但答案 1 :(得分:0)
向metric
添加新project.Metrics
以及将project
附加到上下文时的顺序错误。
您Metrics
的{{1}}集合中有许多ID = 0的指标。现在将此图附加到上下文时,EF会将项目和所有子集合置于project
状态。该异常会抱怨ID = 0的实例不止一个。
要解决此问题,您必须调用此行...
Unchanged
... 之前启动foreach循环并将新指标添加到附加this.Context.Projects.Attach(project)
的{{1}}集合中。然后,EF更改检测会自动将它们识别为新的子项,并将它们置于上下文中Metrics
状态。在project
状态允许重复ID(只要您的主键是数据库标识列)。