原谅我,但我真的需要帮助。
我需要更新一个具有另一个实体集合的实体(Db中的一对多关系),但是当我尝试更新主要实体时,我最终遇到此错误:
System.Data.SqlClient.SqlException:当IDENTITY_INSERT设置为OFF时,无法在表'CustomProperties'中为标识列插入显式值。
我正在使用项目模板“ Aspnetboilerplate”,并使用其功能更新实体。
这是我的“主”类/实体,称为“模型”:
public class Mockup : FullAuditedEntity<int, User>
{
public string Name { get; set; }
public string Json { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public string Support { get; set; }
public string Format { get; set; }
public ICollection<CustomProperty> CustomProperties { get; set; }
}
我要在此处更新“ CustomProperties”集合。
这是我的Customproperty类/实体:
public class CustomProperty : FullAuditedEntity<int>
{
public int JsonElementId { get; set; }
public string Value { get; set; }
public CustomPropertyType Type { get; set; }
public Mockup Mockup { get; set; }
}
当我尝试进行更新时,我无法真正理解为什么它要尝试执行“ IDENTITY_INSERT”以及如何使用另一种方式。如何使我的更新正常工作?
这是我发布到aspnetboilerplate更新函数的Json的一个示例。 Automapper将其映射到上面发布的实体:
{
"name":"okok",
"json":"",
"width":827,
"height":1170,
"support":null,
"format":null,
"customProperties":[
{
"jsonElementId":949264,
"value":"150",
"type":0,
"id":3335
},
{
"jsonElementId":427781,
"value":"150",
"type":0,
"id":3336
},
{
"jsonElementId":165189,
"value":"366.99445670195036",
"type":0,
"id":3337
},
{
"jsonElementId":110359,
"value":"150",
"type":0,
"id":3338
},
{
"jsonElementId":342044,
"value":"150",
"type":0,
"id":3339
}
],
"id":8040
}
}
当我为新实体执行此操作时,它也在Db中创建了模型实体和CustomProperties,也没有任何问题,但是当我尝试更新集合(在删除Collection中的一些CustomProperty之后)时,出现错误。
答案 0 :(得分:1)
我认为问题出在默认方法AsyncCrudAppService中。如果你期待 更新方法: `公共虚拟异步任务更新(TUpdateInput输入) { CheckUpdatePermission();
var entity = await GetEntityByIdAsync(input.Id);
MapToEntity(input, entity);
await CurrentUnitOfWork.SaveChangesAsync();
return MapToEntityDto(entity);
}`
实体加载时不包含任何内容,因此实体框架尝试插入包含在导航属性中的元素,但是它们已经存在,则出现错误...
您应该找到一种方法,使该var实体=等待GetEntityByIdAsync(input.Id);包含。 因此,您可以覆盖添加一个include的方法,它应该可以工作。
我们保持联系;)
答案 1 :(得分:0)
问题是您有一个具有以下属性的自定义属性:
JsonElementId
!= 0, AND Added
(可能)我不知道怎么回事。
但是JsonElementId
可能被配置为IDENTITY
。那就是他的价值是由分贝计算出来的。因此,如果您为数据库提供值,则数据库会抱怨,除非您SET IDENTITY_INSERT OFF
要求数据库授权设置该值(此处不推荐)。
所以您必须找到为什么要使用CustomProperty:
Unchanged
状态,或者