将1更新为多个导航属性时出错

时间:2019-03-05 16:39:01

标签: c# asp.net sql-server entity-framework aspnetboilerplate

原谅我,但我真的需要帮助。

我需要更新一个具有另一个实体集合的实体(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之后)时,出现错误。

2 个答案:

答案 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
  • 一个entity state = Added(可能)

我不知道怎么回事。

但是JsonElementId可能被配置为IDENTITY。那就是他的价值是由分贝计算出来的。因此,如果您为数据库提供值,则数据库会抱怨,除非您SET IDENTITY_INSERT OFF要求数据库授权设置该值(此处不推荐)。

所以您必须找到为什么要使用CustomProperty:

  • 未处于Unchanged状态,或者
  • 获取非0密钥。