实体框架在出错后“丢失”了一行,仍然可以导航到行详细信息

如何解决实体框架在出错后“丢失”了一行,仍然可以导航到行详细信息

我在工作中处理的一个应用程序有一个有趣的错误,我们无法追踪,我在搜索中找不到任何类似的东西。

我的公司建立了一个帮助台系统来跟踪用户问题,在提交错误后,该票从所有票的列表中“消失”了。它在数据库中仍然可见,并且没有在任何地方被过滤掉。可以通过将 URL 更改为票证 ID 来导航到票证,所有详细信息都与保存错误之前相同。

我们最终通过重新启动网络应用解决了这个问题,但我们想追踪该行从列表中消失的原因。

我继承了这个应用程序,它有很多我们已经意识到的问题,所以我倾向于需要从头开始重建整个事情以使保存方法完全异步而不是一半- 我们目前拥有的一半。

不确定要发布什么代码作为示例,因为它在绝大多数情况下都有效,但显然其中有些不对劲。

编辑添加:这是控制器的编辑帖子方法

        [HttpPost]
    public async Task<ActionResult> Edit(EditTicketViewModel ticket)
    {
        try
        {
            var tech = (ticket.Technician_ID != null) ? this.UserService.Get(ticket.Technician_ID) : this.UserService.Get(this.User.Identity.GetUserId());
            var cust = this.UserService.Get(ticket.Customer_ID);
            var ogticket = this.TicketService.Get(ticket.Id);
            var dateEdited = DateTime.UtcNow;
            var productVersionId = OrganisationService.GetOrgProduct(ticket.OrgId,true).First(x => x.ProductID == ticket.ProductID).Product_Version.Id; ;

            await this.TicketService.Edit(ticket.Id,ticket.Title,ticket.Description,dateEdited,ticket.Date_Closed,ticket.Customer_ID,ticket.State_Code,ticket.Priority_Code,ticket.Technician_ID,ticket.ProductID,productVersionId,ticket.Ticket_Type_ID);

            if (ticket.State_Code == (int)StateCode.Closed)
            {
                await this.IntegrationService.SendEmailAsync(new EmailProperties()
                {
                    Email = cust.Email,Subject = "Ticket Closed",Body = "Your ticket '{ticket.Title}' has now been closed.\n\n"//+
                    //$"Log into the portal to view it now -> <a href='https://helpdesk.rubixx.co.uk/Ticket/Details/{ticket.Id}'>Ticket {ticket.Id}</a>"
                });
                await this.IntegrationService.PrepareTeamsMessageAsync(new MessageProperties()
                {
                    Summary = $"{this.UserService.Get(this.User).FullName} has closed a ticket",Ticket_Id = ticket.Id,Note_Id = null,Type = TeamsMessageType.Closed
                });
            }
            else await this.IntegrationService.PrepareTeamsMessageAsync(new MessageProperties()
            {
                Summary = $"{this.UserService.Get(this.User).FullName} has updated a ticket",Type = TeamsMessageType.Updated
            });

            this.TicketService.CreateTimelineEvent(ticket.Id,this.User.Identity.GetUserId(),DateTime.UtcNow.ToLocalTime(),"",TimelineEventType.TicketEdited);

            this.AddToastMessage("Success","Edited Successfully",ToastType.Success);
            return Redirect(ticket.ReturnUrl);
        }
        catch (Exception ex)
        {
            this.IntegrationService.LogMessage($"Exception occurred: {ex.Message}");
            this.AddToastMessage("Error: ","An internal error has occurred",ToastType.Error);
            return this.Redirect("/");
        }
    }

以及实际保存更改的服务函数:

        public async Task Edit(int ID,string Title,string Description,DateTime? dateedited,DateTime? dateclosed,string CustomerId,int StateCode,int Prioritycode,string TechnicianId,int Productid,int? productVersionId,int ticketType = (int)TicketTypeEnum.Support)
    {
        var originalTicket = Context.Tickets.Find(ID);
        originalTicket.Title = Title;
        originalTicket.Technician_ID = TechnicianId;
        originalTicket.State_Code = ticketType == (int)TicketTypeEnum.FeatureRequest ? (int)Enums.StateCode.FeatureSuggestion : StateCode;
        originalTicket.Priority_Code = ticketType == (int)TicketTypeEnum.FeatureRequest ? (int)PriorityCode.FeatureSuggestion : Prioritycode;
        originalTicket.Description = Description;
        originalTicket.Date_Edited = dateedited;
        originalTicket.Date_Closed = dateclosed;
        originalTicket.Customer_ID = CustomerId;
        originalTicket.ProductID = Productid;
        originalTicket.Product_Version_ID = productVersionId;
        originalTicket.Ticket_Type_ID = ticketType;

        await Context.SaveChangesAsync();
    }

这是 CreateTimelineEvent 代码:

        public void CreateTimelineEvent(int ticketno,string raisedby,DateTime dateadded,string details,TimelineEventType type,string assignedto = null)
    {
        try
        {
            var timelineEvent = new TimelineEvent()
            {
                Ticket_Number = ticketno,Raised_By = raisedby,DateAdded = dateadded,Details = details,Type = (int)type,Assigned_To = assignedto
            };
            Context.TimelineEvents.Add(timelineEvent);
            Context.SaveChanges();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

GetTickets 函数:

        public IEnumerable<Ticket> GetTickets(FilterType type,string current_user_id,TicketTypeEnum ticketType = TicketTypeEnum.Support)
    {
        IEnumerable<Ticket> tickets = null;

        switch (ticketType)
        {
            case TicketTypeEnum.Support:
                tickets = Context.Tickets.Include(e => e.Tech).Include(e => e.Customer).SupportTickets();
                break;
            case TicketTypeEnum.FeatureRequest:
                tickets = Context.Tickets.Include(e => e.Tech).Include(e => e.Customer).FeatureRequestTickets();
                break;
            default:
                tickets = Context.Tickets.Include(e => e.Tech).Include(e => e.Customer);
                break;
        }

        switch (type)
        {
            case FilterType.OpenTickets:
                return tickets.OpenTickets();
            case FilterType.ClosedTickets:
                return tickets.ClosedTickets();
            case FilterType.MyOpenTickets:
                return tickets.MyOpenTickets(current_user_id);
            case FilterType.OpenedToday:
                return tickets.OpenedToday();
            case FilterType.DueToday:
                return tickets.DueToday();
            default:
                return tickets;
        }
    }

解决方法

很抱歉花了这么长时间才回到这个问题,但在我发布这篇文章后不久,我设法将问题追溯到一个创建 DBContext 静态实例的本土依赖注入系统。

我们决定在 .Net Core 中重写系统以利用内置的依赖注入。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-