更新 Entity Framework 中的多级属性
Updating multiple level properties in Entity Framework
我有一个具有多级属性的实体结构,每个 header table 条目都有多个 child table 条目,并且关系经过多级。 Table 图表显示在这里:
我需要获取与 ECNEntries table 中的一个条目相关的所有数据以显示在网格中。用户可以在所有级别编辑条目、删除一些条目、添加更多条目。
我可以像这样获取特定条目的所有数据:
var ECNEntryInDb = ECNEntriesRepo.FindAll(f => f.ECNStages
.Select(i => i.ECNComponentDetails
.Select(j => j.ECNMaterialReferenceDetails
.Select(k => k.ECNComponentDetails))))
.Where(x => x.Id == ECNEntriesData.Id).FirstOrDefault();
但我找不到将此数据更新回数据库的方法。
当我这样尝试时:
var xx = Mapper.Map<DAL.Entities.ECNEntries>(ECNEntriesData);
ECNEntriesRepo.Update(xx);
我遇到异常:
Attaching an entity of type 'ProductionControl.DAL.Entities.ECNEntries' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.
当我尝试这个时:
var ECNEntryInDb = ECNEntriesRepo.FindAll(f => f.ECNStages
.Select(i => i.ECNComponentDetails
.Select(j => j.ECNMaterialReferenceDetails
.Select(k => k.ECNComponentDetails)))).Where(x => x.Id == ECNEntriesData.Id).FirstOrDefault();
//var ECNEntryInDb = ECNEntriesRepo.FindById(ECNEntriesData.Id);
Mapper.Map<BL.DTO.ECN.ECNEntries, DAL.Entities.ECNEntries>(ECNEntriesData, ECNEntryInDb);
ECNEntriesRepo.Update(ECNEntryInDb);
这是我得到的:
The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
我尝试了此 page 中建议的一些解决方案,例如添加复合键等等。它也没有用。
给出如下异常:
Adding a relationship with an entity which is in the Deleted state is
not allowed
这是示例数据结构:
"EcnEntries": [
{
"Id": 49,
"ECNHeaderId": 11,
"ECNVersionId": 8,
"ECNVersion": null,
"ECNPartNumber": "280384-01/01M",
"ECNStages": [
{
"Id": 25,
"ECNEntriesId": 49,
"OperationNo": "006",
"WorkCenterId": 198,
"ChangesRequired": "asxa",
"ReasonForChanges": "erte",
"ECNComponentDetails": [
{
"Id": 31,
"ECNStagesId": 25,
"CurrentBOMPartNumber": "jhjhk",
"ReplacementComponentPartnumber": "uyuyuy",
"ECNMaterialReferenceDetails": [
{
"Id": 38,
"ECNComponentDetailsId": 31,
"MaterialReferenceNumber": "323"
},
{
"Id": 39,
"ECNComponentDetailsId": 31,
"MaterialReferenceNumber": "12"
}
]
}
]
}
]
}
]
编辑
这就是存储库实现中的更新功能所做的。我如何更改引用 child table objects 的状态?
public void Update(T entity)
{
contextFactory.GetDataContext().Entry(entity).State = EntityState.Modified;
}
任何人都可以建议一种更新此数据的方法吗?我是否需要遍历每个 child 并更新数据?在那种情况下,我也很困惑如何同时遍历来自 UI 的数据和数据库中的实体以应用更改。我不确定我是否搞砸了一些非常简单的事情。
提前致谢。
正如@jdweng 所说,问题出在 Automapper 上。
发现这个 link 有用。
自动映射器正在替换引用子 table 对象,最终将引用设置为 null。它触发了错误。
我有一个具有多级属性的实体结构,每个 header table 条目都有多个 child table 条目,并且关系经过多级。 Table 图表显示在这里:
我需要获取与 ECNEntries table 中的一个条目相关的所有数据以显示在网格中。用户可以在所有级别编辑条目、删除一些条目、添加更多条目。
我可以像这样获取特定条目的所有数据:
var ECNEntryInDb = ECNEntriesRepo.FindAll(f => f.ECNStages
.Select(i => i.ECNComponentDetails
.Select(j => j.ECNMaterialReferenceDetails
.Select(k => k.ECNComponentDetails))))
.Where(x => x.Id == ECNEntriesData.Id).FirstOrDefault();
但我找不到将此数据更新回数据库的方法。
当我这样尝试时:
var xx = Mapper.Map<DAL.Entities.ECNEntries>(ECNEntriesData);
ECNEntriesRepo.Update(xx);
我遇到异常:
Attaching an entity of type 'ProductionControl.DAL.Entities.ECNEntries' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.
当我尝试这个时:
var ECNEntryInDb = ECNEntriesRepo.FindAll(f => f.ECNStages
.Select(i => i.ECNComponentDetails
.Select(j => j.ECNMaterialReferenceDetails
.Select(k => k.ECNComponentDetails)))).Where(x => x.Id == ECNEntriesData.Id).FirstOrDefault();
//var ECNEntryInDb = ECNEntriesRepo.FindById(ECNEntriesData.Id);
Mapper.Map<BL.DTO.ECN.ECNEntries, DAL.Entities.ECNEntries>(ECNEntriesData, ECNEntryInDb);
ECNEntriesRepo.Update(ECNEntryInDb);
这是我得到的:
The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
我尝试了此 page 中建议的一些解决方案,例如添加复合键等等。它也没有用。 给出如下异常:
Adding a relationship with an entity which is in the Deleted state is not allowed
这是示例数据结构:
"EcnEntries": [
{
"Id": 49,
"ECNHeaderId": 11,
"ECNVersionId": 8,
"ECNVersion": null,
"ECNPartNumber": "280384-01/01M",
"ECNStages": [
{
"Id": 25,
"ECNEntriesId": 49,
"OperationNo": "006",
"WorkCenterId": 198,
"ChangesRequired": "asxa",
"ReasonForChanges": "erte",
"ECNComponentDetails": [
{
"Id": 31,
"ECNStagesId": 25,
"CurrentBOMPartNumber": "jhjhk",
"ReplacementComponentPartnumber": "uyuyuy",
"ECNMaterialReferenceDetails": [
{
"Id": 38,
"ECNComponentDetailsId": 31,
"MaterialReferenceNumber": "323"
},
{
"Id": 39,
"ECNComponentDetailsId": 31,
"MaterialReferenceNumber": "12"
}
]
}
]
}
]
}
]
编辑
这就是存储库实现中的更新功能所做的。我如何更改引用 child table objects 的状态?
public void Update(T entity)
{
contextFactory.GetDataContext().Entry(entity).State = EntityState.Modified;
}
任何人都可以建议一种更新此数据的方法吗?我是否需要遍历每个 child 并更新数据?在那种情况下,我也很困惑如何同时遍历来自 UI 的数据和数据库中的实体以应用更改。我不确定我是否搞砸了一些非常简单的事情。
提前致谢。
正如@jdweng 所说,问题出在 Automapper 上。 发现这个 link 有用。
自动映射器正在替换引用子 table 对象,最终将引用设置为 null。它触发了错误。