Entity Framework - 无法在同一方法中删除和插入到 DbContext
Entity Framework - Can't Delete and Insert to DbContext in the same method
所以我用的3个table是Event
和Tag
table,它们是多对多的关系,也就是'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
添加了Event
、Tag
和EventTag
classes,以及配置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 的条目实际上并未被删除调用插入时,会出现该错误。
无论如何,谢谢你们的帮助。
所以我用的3个table是Event
和Tag
table,它们是多对多的关系,也就是'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
添加了Event
、Tag
和EventTag
classes,以及配置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 的条目实际上并未被删除调用插入时,会出现该错误。
无论如何,谢谢你们的帮助。