我正在使用一个正在工作的Web API项目对EF Core遇到真正的困难...对我而言,EF Core根本不直观。我处于断开连接的环境中,正在尝试更新Sudoku游戏。与更新游戏相比,EF Core花费更多的时间来删除用户及其应用程序和角色之间的连接。如何在更新中禁用删除语句?没有删除的理由,我不需要它们。我该如何阻止他们?
方法如下,将游戏加载为图形,我的理解是此代码应将跟踪的所有内容更改为已修改或添加。在我看来,EF Core似乎已经淘汰了删除内容的方法……这毫无意义。我从没指示它删除任何内容:
-Ofast -g3
答案 0 :(得分:0)
好吧,我找到了解决方法,但这等同于用泡泡糖和胶带固定您的自行车。丑陋的...但是行得通。在保存游戏之前,我创建了所有关联的应用程序和角色的列表,然后在 await context.SaveChangesAsync(); 之后重新创建并重新保存值。下面列出了代码:
async public Task<IRepositoryResponse> Update(TEntity entity)
{
var result = new RepositoryResponse();
try
{
entity.DateUpdated = DateTime.UtcNow;
context.Games.Update(entity);
context.ChangeTracker.TrackGraph(entity,
e => {
var dbEntry = (IEntityBase)e.Entry.Entity;
if (dbEntry.Id != 0)
{
e.Entry.State = EntityState.Modified;
}
else
{
e.Entry.State = EntityState.Added;
}
});
var apps = new List<App>();
var roles = new List<Role>();
foreach (var userApp in entity.User.Apps)
{
apps.Add(userApp.App);
}
foreach (var userRole in entity.User.Roles)
{
roles.Add(userRole.Role);
}
await context.SaveChangesAsync();
foreach (var app in apps)
{
userAppDbSet.Add(new UserApp(entity.UserId, app.Id));
}
foreach (var role in roles)
{
userRoleDbSet.Add(new UserRole(entity.UserId, role.Id));
}
await context.SaveChangesAsync();
result.Success = true;
result.Object = entity;
return result;
}
catch (Exception exp)
{
result.Success = false;
result.Exception = exp;
return result;
}
}
必须有更好的方法吗?完整的应用程序可以在这里找到,有人可以告诉我一种更好的设置方法: