使用通过 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
;
;
奇怪的是:上面的代码总是写两条新记录,增加Id
s,虽然它只有一个引用,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事件