通过 React GUI 触发 entity framework 向数据库添加新条目时出现重复条目

Duplicate entries when adding new entries to DB with entity framework triggered via React GUI

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

以下代码工作正常,除了它总是创建双数据库条目。我确定代码只被调用一次,我使用断点进行了检查。假设我的数据库上下文被称为 _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 确实作为外键存在于 table User 中。

编辑

我发现这个函数实际上被调用了两次,但我不明白为什么。

相关问题

你的代码是正确的,检查 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>
        );
    }
}