Entity Framework - 无法在同一方法中删除和插入到 DbContext

Entity Framework - Can't Delete and Insert to DbContext in the same method

所以我用的3个table是EventTagtable,它们是多对多的关系,也就是'simulated' 通过桥接 table 与每个 table、EventTag 具有一对多关系,其外键构成复合主键。

在我的代码中,我想虽然效率很低,但我试图在添加 Tag 与特定 [=] 相关联时从 EventTag table 中删除条目16=] 或更改现在与其关联的现有标签。

当我只删除与事件关联的标签或当我只添加 新标签,但是当我在同一个调用中 添加和删除 标签时,标签只会被删除,而不会进行任何更改以添加新标签。

我尝试取出对 context.SaveChanges(); 的第一个调用,将其全部放在一个 (using DbContext ... ) 块中,但似乎都不起作用。我不知道问题出在哪里。

public async Task<string> Post(AddTagsRequest request)
    {
        string problem = "";
        try
        {
            using (DbContext context = new DbContext())
            {
                var eventtagstodelete =
                    await context.EventTags.Where(eventtag => eventtag.EventId == request.EventId).ToListAsync();
                foreach (var eventtagtodelete in eventtagstodelete)
                {
                    context.Entry(eventtagtodelete).State = EntityState.Deleted;
                }

                List<Tag> Tags = request.Tags.Select(tag => new Tag {Value = tag}).ToList();

                List<string> tagIds = new List<string>();

                foreach (var tag in Tags)
                {
                    List<Tag> foundTags = await context.Tags.Where(row => row.Value == tag.Value).ToListAsync();
                    if (foundTags.Count > 0)
                    {
                        tagIds.Add(foundTags.First().Id);
                    }
                    else
                    {
                        context.Tags.Add(new Tag
                        {
                            Value = tag.Value
                        });
                    }
                }

                foreach (var tagId in tagIds)
                {
                    context.EventTags.Add(new EventTag
                    {
                        TagId = tagId,
                        EventId = request.EventId
                    });
                }
                await context.SaveChangesAsync();
                return "success";
            }
        }
        catch (Exception e)
        {
            while(e.InnerException != null){
                e = e.InnerException;
            }
            return "failure - Message: " + e.Message;
        }
    }

public class AddTagsRequest
{
    public List<string> Tags { get; set; }
    public string EventId { get; set; }
}

public class Event : EntityData
{
    public string Name { get; set; }
}

public class Tag : EntityData
{
    public string Value { get; set; }
}

public class EventTag : EntityData
{
    public Event Event { get; set; }
    public string EventId { get; set; }
    public Tag Tag { get; set; }
    public string TagId { get; set; } 
}

    public EventTagConfig()
    {
        HasKey(eventTag => new { eventTag.EventId, eventTag.TagId });
    }

更新 1

添加了EventTagEventTagclasses,以及配置classEventTagConfig来配置EventTag table.

将代码从 2 using 和 2 context.SaveChanges(); 更改为每个只有 1 个。

当我运行这样时,我得到以下错误:

Modifying a column with the 'Identity' pattern is not supported. Column: 'Id'. Table: 'CodeFirstDatabaseSchema.EventTag'.

多个 saves/contexts 没有问题 - 我只是做了一些愚蠢的事情。

我实际上删除了第二次使用,并在需要保留更改的任何时间保存。我遇到的问题是在我的 if-else 块中,我将现有标签的 Id 添加到 tagIds 列表中,但是在添加另一个标签时,我并没有将新的 Id 添加到列表中,所以它没有添加 EventTag 条目这次,但是当我第二次 运行 时,找到了 'new'-now-existing 标签,并将其 ID 添加到列表中。

为了修复,我将所有新标签添加到列表中 - newTagList,在 else 块中,然后调用 context.Tags.AddRange(newTagList),接着调用 context.SaveChanges(),然后从 newTagList 添加到 EventTag table.

注意 - @UrbanEsc 我在更新中发布的错误是@Henk_Holterman 建议的更改的结果,并且是由于标有 EntityState.Deleted 的条目实际上并未被删除调用插入时,会出现该错误。

无论如何,谢谢你们的帮助。