附加类型为..的实体失败,因为相同类型的另一个实体已经具有相同的主键值
本文关键字:实体 键值 另一个 同类型 类型 失败 因为 | 更新日期: 2023-09-27 18:06:32
我正在使用automapper重构一些代码,见下文,旧代码被注释掉了。
var propertyInUse = context.Properties.FirstOrDefault(j => j.ID != src.PropertyId && j.UPRN.ToLower() == src.UPRN.ToLower() && j.ContractId == src.ContractId);
if (propertyInUse == null)
{
var property = context.Properties.FirstOrDefault(j => j.ID == src.PropertyId);
if (property != null)
{
if (src.PropertyTypeId == 0)
{
src.PropertyTypeId = null;
}
src.Created = property.Created;
src.CreatedBy = property.CreatedBy;
src.ContractId = property.ContractId;
Mapper.CreateMap<Job, Property>();
property = Mapper.Map<Property>(src);
//property.PropertyNo = src.PropertyNo;
//property.BlockName = src.BlockName;
//property.StreetName = src.StreetName;
//property.AddressLine2 = src.AddressLine2;
//property.AddressLine3 = src.AddressLine3;
//property.AddressLine4 = src.AddressLine4;
//property.Postcode = src.Postcode;
//property.Latitude = src.Latitude;
//property.Longitude = src.Longitude;
//property.BlockUPRN = src.BlockUPRN;
//property.Comments = src.Comments;
//property.NumberOfBathrooms = src.NumberOfBathrooms;
//property.NumberOfBedrooms = src.NumberOfBedrooms;
//property.NumberOfKitchens = src.NumberOfKitchens;
//property.LastModifiedby = src.LastModifiedby;
property.LastModified = DateTime.Now;
context.Entry(property).State = EntityState.Modified;
success = true;
context.SaveChanges();
编辑:请注意,属性对象是从基础设置的,因此建议的重复问题不适用。
当状态设置为modified时,我得到以下异常;
附加一个类型为'M.Survey.ServiceLayer.Model '的实体。属性'失败,因为相同类型的另一个实体已经具有相同的主键值。当使用"Attach"方法或将实体的状态设置为"Unchanged"或"Modified"(如果图中的任何实体具有冲突的键值)时,可能会发生这种情况。这可能是因为一些实体是新的,还没有接收到数据库生成的键值。在这种情况下,使用"添加"方法或"添加"实体状态来跟踪图形,然后根据需要将非新实体的状态设置为"未更改"或"修改"。
是什么原因导致的,我如何解决它?
您尝试过映射到现有对象吗?
Mapper.Map(src, property);
关于实体状态垃圾的业务很少是正确的。相反,将DTO中的值映射到EF返回的实体中。
我认为你应该忽略主键属性映射。Property模型的主键是什么?
查看错误信息:附加失败,因为另一个相同类型的实体已经有相同的主键值
我们过去也遇到过这个问题:
- 我们加载了一个对象A,它在dbcontext中有子对象B,然后在GUI中使用这些对象
- 当允许来自GUI的帖子时,我们用另一个数据库上下文加载了另一个对象B'(与B具有相同的PK),该对象仅用于验证参数的一些更改。
- 然后我们想通过将子对象B附加到dbcontext来保存对象A,但是随后发生了错误。
发生错误是因为,除了对象B之外,已经有一个对象B具有相同的PK,来自另一个数据库上下文
我们通过以下方式解决了这个问题:
- 重新获取对象A和他的子对象B,然后从GUImodels设置所有属性,然后将其刷新到数据库。
- 我们不再附加gui模型(来自先前dbcontext的对象A和B)
- 我们不再单独获取对象B。
可以是对象属性已经从对象src作为子对象加载,然后自动映射到对象属性,从而添加到上下文,然后将通知具有相同pk的对象类型?
在这里我发现了一个类似的帖子