C# 如何正确更新(添加/更新/删除)实体(EF Core)的相关数据
我使用FluentAPI配置了以下简化模型,以使MS SQL表正常工作:C# 如何正确更新(添加/更新/删除)实体(EF Core)的相关数据,c#,entity-framework,.net-core,entity-framework-core,repository-pattern,C#,Entity Framework,.net Core,Entity Framework Core,Repository Pattern,我使用FluentAPI配置了以下简化模型,以使MS SQL表正常工作: CV: int ID string Title List<SkillCV> SkillsCVs // many-to-many junction/associative model/table to link the 2 tables SkillCV: int CvID int SkillID bool IsCore Skill: int ID string
CV:
int ID
string Title
List<SkillCV> SkillsCVs // many-to-many junction/associative model/table to link the 2 tables
SkillCV:
int CvID
int SkillID
bool IsCore
Skill:
int ID
string Title
我使用的存储库模式被注入到API控制器中的服务中。因此,我将直接将逻辑简化为服务方法:
public async Task<int> UpdateAsync(CV cv)
{
var cvDB = await context.Set<CV>()
.Include(CV => CV.SkillsCVs)
.ThenInclude(skillCV => skillCV.Skill)
.Include(CV => CV.User)
.FirstOrDefaultAsync(CV => CV.Id == cv.Id);
cvDB.Title = cv.Title;
SkillCV[] skillsCVs = ...; // I get this with SemaphoreSlim, because it has concurrency issues with async lambda in LINQ method
// assume that I have the "new" SkillCV array of entities that I need to replace the old ones with
// cvDB.SkillsCVs = skillsCVs.ToList(); // many exceptions here
UpdateSkills(cvDB, skillsCVs);
}
如何将旧的cvDB.SkillsCVs列表替换为新的SkillsCVs列表?当两个列表都是相等的、具有相同值的相同实体时,我已经获得了一个id为。。。例外如果旧的cvDB.SkillsCVs数组为空,则添加新实体时不会出现问题。如何解决状态未更改/已删除的问题。我需要一个方法,将更新一个新的列表列表列表
public UpdateSkills(CV cv, List<SkillsCV> newSkillsCVs)
{
var oldSkillsCVs = cv.SkillsCVs;
// how to replace oldSkillsCVs with newSkillsCVs
}
你能帮我用这个方法吗?我已将所有内容都包含在简历中您应该清除收藏CV.SkillsVCs,然后在其中填充新闻短片:
cv.SkillsCVs.Clear();
cv.SkillsCVs.AddRange(newSkillsCVs);
一定有更好的办法但我现在能想到的 ifcv.SkillsCVs!=null | | cv.SkillCVs.Count!=0 context.Entrycv.SkillsCVs.State=EntityState.Detached; cv.SkillsCVs=新闻杀手scvs;
非常糟糕的想法-这将从数据库中删除所有技能行并添加新技能,而您只想删除删除的技能并添加新技能;wait context.SaveChangesAsync;它显示:System.InvalidOperationException:无法跟踪实体类型“CV”的实例,因为另一个键值为“{Id:8}”但我要更新的CV具有Id14@DannyVarod:它仅删除cv的SKILLSCV,而不是数据库系统中的所有技能行。InvalidOperationException:未找到实体类型“List”。确保已将实体类型添加到模型中。为什么会这样?我错过了什么?