通过 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
};
};
奇怪的是:上面的代码总是写入两条新记录,并增加 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
确实作为外键存在于 table User
中。
编辑
我发现这个函数实际上被调用了两次,但我不明白为什么。
相关问题
- Entity Framework Creates New / Duplicate Entries for Associated Objects
你的代码是正确的,检查 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>
);
}
}
我继承了 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
};
};
奇怪的是:上面的代码总是写入两条新记录,并增加 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
确实作为外键存在于 table User
中。
编辑
我发现这个函数实际上被调用了两次,但我不明白为什么。
相关问题
- Entity Framework Creates New / Duplicate Entries for Associated Objects
你的代码是正确的,检查 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>
);
}
}