离线环境中的EF核心删除实体

时间:2020-11-11 21:02:16

标签: entity-framework-core

我正在使用一个正在工作的Web API项目对EF Core遇到真正的困难...对我而言,EF Core根本不直观。我处于断开连接的环境中,正在尝试更新Sudoku游戏。与更新游戏相比,EF Core花费更多的时间来删除用户及其应用程序和角色之间的连接。如何在更新中禁用删除语句?没有删除的理由,我不需要它们。我该如何阻止他们?

方法如下,将游戏加载为图形,我的理解是此代码应将跟踪的所有内容更改为已修改或添加。在我看来,EF Core似乎已经淘汰了删除内容的方法……这毫无意义。我从没指示它删除任何内容:

-Ofast -g3

1 个答案:

答案 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;
            }
        }

必须有更好的方法吗?完整的应用程序可以在这里找到,有人可以告诉我一种更好的设置方法:

https://github.com/Joseph-Anthony-King/SudokuCollective