无法跟踪,因为另一个实例具有相同的键值

r3plica

我正在尝试在我的API中构建标签系统。我有一个带有“标签”的模型,如下所示:

public class Screenshot: UserExtension
{
    [Key] public int Id { get; set; }
    [Required, MaxLength(2083)] public string Url { get; set; }
    public int StartTime { get; set; }
    public int EndTime { get; set; }
    public State State { get; set; }

    public IList<ScreenshotTag> Tags { get; set; }
    public IEnumerable<ScreenshotVideo> Videos { get; set; }
}

ScreenshotTag只是看起来是这样的:

public class ScreenshotTag
{
    public int ScreenshotId { get; set; }
    public string TagId { get; set; }

    public Screenshot Screenshot { get; set; }
    public Tag Tag { get; set; }
}

而一个标签是非常简单的(现在)

public class Tag
{
    [Key] public string Id { get; set; }

    public IEnumerable<ScreenshotTag> Tags { get; set; }
    public IEnumerable<VideoTag> Videos { get; set; }
}

问题是,我想一次性修改Screenshot标签。所以我创建了这个端点:

public async Task<bool> Handle(ScreenshotTagUpdate query, CancellationToken cancellationToken)
{
    var request = query.Model;
    var screenshot = await _mediator.Send(new ScreenshotGet(request.Id), cancellationToken);
    var model = screenshot.Create();

    foreach (var tag in model.Tags)
        if (!request.Tags.Any(m => m.Equals(tag.TagId)))
            _databaseContext.Remove(tag);

    foreach (var tag in request.Tags)
    {
        if (model.Tags.Any(m => m.TagId.Equals(tag))) continue;

        await _tagValidator.ValidateAsync(new Tag {Id = tag}, cancellationToken);
        _databaseContext.Add(new ScreenshotTag { ScreenshotId = request.Id, TagId = tag });
    }

    await _databaseContext.SaveChangesAsync(cancellationToken);

    return true;
}

如您所见,我只调用一次SaveChangesAsync这是在我删除或添加了ScreenshotTags之后当我运行此代码时,出现以下错误:

无法跟踪实体类型'ScreenshotTag'的实例,因为已经跟踪了另一个键值为'{ScreenshotId:1,TagId:th-1}'的实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。

该错误首先发生_databaseContext.Remove(tag)有谁知道我该如何阻止这种情况的发生?

r3plica

我不得不将方法更改为此:

public async Task<bool> Handle(ScreenshotTagUpdate query, CancellationToken cancellationToken)
{
    var request = query.Model;
    var screenshot = await _mediator.Send(new ScreenshotGet(request.Id), cancellationToken);
    var model = screenshot.Create();

    foreach (var tag in model.Tags)
        if (!request.Tags.Any(m => m.Equals(tag.TagId)))
        {
            var t = _databaseContext.ScreenshotTags.Single(m =>
                m.TagId == tag.TagId & m.ScreenshotId == tag.ScreenshotId);
            _databaseContext.Remove(t);
        }

    foreach (var tag in request.Tags)
    {
        if (model.Tags.Any(m => m.TagId.Equals(tag))) continue;

        await _tagValidator.ValidateAsync(new Tag {Id = tag}, cancellationToken);
        _databaseContext.Add(new ScreenshotTag { ScreenshotId = request.Id, TagId = tag });
    }

    await _databaseContext.SaveChangesAsync(cancellationToken);

    return true;
}

我不喜欢这种解决方案,因此,如果有人有更好的解决方案,请随时添加!

PS:我唯一改变的是:

_databaseContext.Remove(tag);

至:

var t = _databaseContext.ScreenshotTags.Single(m =>
    m.TagId == tag.TagId & m.ScreenshotId == tag.ScreenshotId);
_databaseContext.Remove(t);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

EF Core:无法跟踪实体类型的实例,因为另一个具有相同键值的实例

来自分类Dev

无法跟踪实体类型“ x”的实例,因为已经跟踪了具有相同的{'a','b'}键值的另一个实例

来自分类Dev

无法跟踪实体类型 <T> 的实例,因为已跟踪另一个具有相同 {'Id'} 键值的实例

来自分类Dev

“如何修复“实体类型的实例”无法跟踪,因为另一个具有键值“{TypeId: 1}”的实例已被跟踪。

来自分类Dev

无法跟踪实体类型“ TestType”的实例,因为已经跟踪了具有相同键的该类型的另一个实例

来自分类Dev

无法跟踪实体类型“个人资料”的实例,因为已经跟踪了另一个键值为“ {Id:1087}”的实例

来自分类Dev

无法加载,因为已经加载了另一个具有相同文件的 AssetBundle

来自分类常见问题

ASP.NET MVC-附加类型为“ MODELNAME”的实体失败,因为相同类型的另一个实体已经具有相同的主键值

来自分类Dev

“附加类型T的实体失败,因为相同类型的另一个实体已经具有相同的主键值”

来自分类Dev

EF,Automapper异常,“附加类型...的实体失败,因为相同类型的另一个实体已经具有相同的主键值”

来自分类Dev

附加“ModelName”类型的实体失败,因为另一个相同类型的实体已经具有相同的主键值

来自分类Dev

附加类型为“XXX”的实体失败,因为同一类型的另一个实体已具有相同的主键值

来自分类Dev

为什么会出现此异常“附加类型为'Model'的实体失败,因为相同类型的另一个实体已经具有相同的主键值。”

来自分类Dev

创建另一个相同数组的数组 - 只有一个键值。PHP

来自分类Dev

查询以过滤具有相同非主键值的行,然后从 Oracle 中的结果中排除具有另一个空列的记录

来自分类Dev

克隆Django模型实例对象并将其保存到具有相同字段的另一个模型中

来自分类Dev

将JSONObject值转换为具有键值对的另一个JSONObject

来自分类Dev

如何添加具有引用laravel中另一个表的外键值的表?

来自分类Dev

在对象中添加具有键值的另一个属性

来自分类Dev

类方法如何访问相同类的另一个实例的私有成员?

来自分类Dev

如何设置一个表的外键值必须与另一个表相同

来自分类Dev

将 1 个类转换为具有相同字段的另一个类

来自分类Dev

如何跟踪一个类中另一个类的实例?

来自分类Dev

设置MySQL以在具有EBS的Amazon AWS实例上使用另一个分区

来自分类Dev

SQL 选择具有另一个实体的大多数实例的实体

来自分类Dev

该项目包含另一个具有相同存档名称的依赖项

来自分类Dev

在另一个文本中搜索具有相同顺序字符的文本

来自分类Dev

根据行中的另一个变量删除具有相同值的行

来自分类Dev

从另一个列表创建具有相同索引的值的列表

Related 相关文章

  1. 1

    EF Core:无法跟踪实体类型的实例,因为另一个具有相同键值的实例

  2. 2

    无法跟踪实体类型“ x”的实例,因为已经跟踪了具有相同的{'a','b'}键值的另一个实例

  3. 3

    无法跟踪实体类型 <T> 的实例,因为已跟踪另一个具有相同 {'Id'} 键值的实例

  4. 4

    “如何修复“实体类型的实例”无法跟踪,因为另一个具有键值“{TypeId: 1}”的实例已被跟踪。

  5. 5

    无法跟踪实体类型“ TestType”的实例,因为已经跟踪了具有相同键的该类型的另一个实例

  6. 6

    无法跟踪实体类型“个人资料”的实例,因为已经跟踪了另一个键值为“ {Id:1087}”的实例

  7. 7

    无法加载,因为已经加载了另一个具有相同文件的 AssetBundle

  8. 8

    ASP.NET MVC-附加类型为“ MODELNAME”的实体失败,因为相同类型的另一个实体已经具有相同的主键值

  9. 9

    “附加类型T的实体失败,因为相同类型的另一个实体已经具有相同的主键值”

  10. 10

    EF,Automapper异常,“附加类型...的实体失败,因为相同类型的另一个实体已经具有相同的主键值”

  11. 11

    附加“ModelName”类型的实体失败,因为另一个相同类型的实体已经具有相同的主键值

  12. 12

    附加类型为“XXX”的实体失败,因为同一类型的另一个实体已具有相同的主键值

  13. 13

    为什么会出现此异常“附加类型为'Model'的实体失败,因为相同类型的另一个实体已经具有相同的主键值。”

  14. 14

    创建另一个相同数组的数组 - 只有一个键值。PHP

  15. 15

    查询以过滤具有相同非主键值的行,然后从 Oracle 中的结果中排除具有另一个空列的记录

  16. 16

    克隆Django模型实例对象并将其保存到具有相同字段的另一个模型中

  17. 17

    将JSONObject值转换为具有键值对的另一个JSONObject

  18. 18

    如何添加具有引用laravel中另一个表的外键值的表?

  19. 19

    在对象中添加具有键值的另一个属性

  20. 20

    类方法如何访问相同类的另一个实例的私有成员?

  21. 21

    如何设置一个表的外键值必须与另一个表相同

  22. 22

    将 1 个类转换为具有相同字段的另一个类

  23. 23

    如何跟踪一个类中另一个类的实例?

  24. 24

    设置MySQL以在具有EBS的Amazon AWS实例上使用另一个分区

  25. 25

    SQL 选择具有另一个实体的大多数实例的实体

  26. 26

    该项目包含另一个具有相同存档名称的依赖项

  27. 27

    在另一个文本中搜索具有相同顺序字符的文本

  28. 28

    根据行中的另一个变量删除具有相同值的行

  29. 29

    从另一个列表创建具有相同索引的值的列表

热门标签

归档