使用通过 React GUI 触发的实体框架向 DB 添加新条目时出现重复条目

Posted

技术标签:

【中文标题】使用通过 React GUI 触发的实体框架向 DB 添加新条目时出现重复条目【英文标题】:Duplicate entries when adding new entries to DB with entity framework triggered via React GUI 【发布时间】:2020-01-03 19:27:31 【问题描述】:

我使用实体框架和代码优先方法继承了 ASP.net/C# 中的现有项目。我定义了一个新表并成功完成了所有必要的迁移,以便[myProject].[ExportFiles] 确实在数据库中作为表可见。

以下代码工作正常,除了它总是创建双数据库条目。我确信代码只被调用一次,我使用断点检查过。假设我的数据库上下文名为_db

namespace myProject.Service
   
      public void Export(int userId)
         
            var currentExportTimestamp = DateTime.Now;
            var currentUserId = 42;
            var exportRecord= new ExportFiles // defining a new entry
               
                  FileName = cashflowFileName,
                  DateSubmitted = currentExportTimestamp,
                  UserId = currentUserId,
               ;
           _db.ExportFiles.Add(exportRecord); // nothing written in DB yet
           _db.SaveChanges(); // the entry is written to DB, but twice
         ;
   ;

奇怪的是:上面的代码总是写两条新记录,增加Ids,虽然它只有一个引用,ExportController.cs看起来大致如下:

[Route("api/Export", Order = -1)]
[HttpPost]
public IHttpActionResult Export(int? selectedEntityId, DateTime? selectedDate)
   
      var name = System.Web.HttpContext.Current.User.Identity.Name;
      var userId = _userService.GetUserByName(name).Id;

      if (selectedDate == null || selectedEntityId == null)
         
            return BadRequest("Need to select appropriate data");
         
      try
         
            _export.Export(userId);
            return Ok();
         
   

我的调试练习表明这个控制器已经被调用了两次,但我不知道为什么。

组件MyView.tsx如下所示:

export interface MyViewProps 
    selectedDate: any,
    selectedEntity: number,
    exportStatus: boolean
    setExportingStatus: (exportingStatus: boolean) => void;
    selectDate: (date: any) => void;
    selectEntity: (entityId: number) => void;
    exportDispatch: () => void;


export class MyView extends React.Component<MyViewProps, any> 
    constructor(props) 
        super(props);
        this.handleExport = this.handleExport.bind(this);
    
    handleExport() 
        this.props.setExportingStatus(true); 
        this.props.exportDispatch();
    

    render()   
        return (
            <div>
                <Button
                    type="primary"
                    onClick=this.handleExport
                    disabled=this.props.exportStatus == true
                    > Export
                </Button>
            </div>
        );
    

需要更多信息

数据模型如下:

namespace myProject.Entity.Models

    public class ExportFiles
    
        public int Id  get; set; 
        public string FileName  get; set; 
        public DateTime DateSubmitted  get; set; 
        public int UserId  get; set; 
        public virtual User User  get; set; 
    

currentUserId = 42 确实作为外键存在于表 User 中。

编辑

我认为该函数实际上被调用了两次,但我不明白为什么。

相关问题

Entity Framework Creates New / Duplicate Entries for Associated Objects

【问题讨论】:

两条记录上的 DateSubmitted 值是否相等?这样我们就可以消除您两次调用该方法的情况 【参考方案1】:

您的代码是正确的,检查两个重复值中的 DateSubmitted 值是否相同会告诉您您的记录是否确实被 .SaveChanges() 方法复制了,或者您是否只是调用了整个方法两次。

编辑:由于您添加了 React 代码,我可以看到您正在注册事件而不需要它,因为您已经通过单击按钮触发它,所以这个 this.handleExport = this.handleExport.bind(this); 正在创建重复请求

export class MyView extends React.Component<MyViewProps, any> 
    constructor(props) 
        super(props);
    
    handleExport() 
        this.props.setExportingStatus(true); 
        this.props.exportDispatch();
    

    render()   
        return (
            <div>
                <Button
                    type="primary"
                    onClick=this.handleExport
                    disabled=this.props.exportStatus == true
                    > Export
                </Button>
            </div>
        );
    

【讨论】:

以上是关于使用通过 React GUI 触发的实体框架向 DB 添加新条目时出现重复条目的主要内容,如果未能解决你的问题,请参考以下文章

向zepto.js学习如何手动(trigger)触发DOM事件

使用带有 MVC4 SQL Server 的实体框架插入后触发器不会触发

使用AFTER INSERT触发器将实体框架插入表中

具有集成安全性的实体框架 SQL 连接问题

React父传子和子组件触发修改父组件修改数据

内联 SQL 查询和实体框架触发的查询有啥区别?