.NET Core API 错误数据库操作中无法在数据库中插入新数据
Cannot Insert new Data in the Database in .NET Core API error Database operation
我正在处理 API 并开始添加新数据。我收到此错误。当我在每个输入中手动添加 ID 时,它工作正常,但现在我收到此错误,在从此处添加一些解决方案后,它仍然无法工作。
错误:
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: Database operation expected to affect 1 row(s) but actually affected 0 row(s).
Data may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions.
插入代码:
public bool Insert(string UserName, SendInventoryModel sendInventoryModel)
{
using (DatabaseContext context = new DatabaseContext())
{
bool flag = false;
// Create new
InventoryEntity inventoryEntity = new InventoryEntity
{
UserName = sendInventoryModel.UserName,
Item = sendInventoryModel.Item ,
};
context.Table.Add(inventoryEntity);
context.SaveChanges();
// Check
var model = CheckUserNameID(UserName, sendInventoryModel.Item);
var data = context.Table.Find(model.Id);
if (null != data)
{
flag = true;
}
return flag;
}
}
发送库存模型:
public class SendSiteMailModel
{
[Required]
public string UserName { get; set; }
[Required]
public string Item{ get; set; }
}
库存控制器:
[HttpPost("{username}")]
[Authorize]
public JObject Post([Required] string UserName, [FromBody] SendInventoryModel sendInventoryModel)
{
ResponseModel x = new ResponseModel();
try
{
InventoryRepository InventoryRepository = new InventoryRepository();
bool isSuccess = InventoryRepository.Insert(UserName, sendInventoryModel);
}
catch (Exception error)
{
// if not successful
}
return Json(x);
}
我已经在 InventoryEntity
和 InventoryModel
中添加了 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
。
库存实体:
[Key]
DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
库存模型:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
我还在 DBContext.cs
中添加了以下代码:
public virtual DbSet<OtherTableEntity> Table{ get; set; }
public virtual DbSet<InventoryEntity> Table{ get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<OtherTableEntity>();
modelBuilder.Entity<InventoryEntity>().Property(x => x.Id).ValueGeneratedOnAdd();
base.OnModelCreating(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
最后添加我的 table 设计:库存 ID
:
(Is Identity) = Yes
Identity Increment = 1
Identity Seed = 1
请注意,清单 table 中没有 主键 。它是一个 旧的 table,具有 现有数据 。当前数据库已从 membership 迁移到 identity。
我在插入方法中添加了所有东西后 context.SaveChanges();
仍然不起作用。关于如何解决此问题的任何想法或建议?
注意:我已经根据 Asherguru 的建议更改了 table 实体名称和模型,因为它有点令人困惑和通用。
您的Table实体和数据库中的Table是否相同table名称?
为什么名称不同 - Table实体和 Table?
尝试在 Table 实体 class 中添加 [Table("YourTableNameInDatabase")]。然后 EF 可以在数据库中找到实际的 table 并插入到这个 table.
[Table("YourTableNameInDatabase")]
public partial class TableEntity
{
public int Id { get; set; }
}
如果您显示实际的 table 名称和一些必要的屏幕截图,就不会那么混乱。
我正在处理 API 并开始添加新数据。我收到此错误。当我在每个输入中手动添加 ID 时,它工作正常,但现在我收到此错误,在从此处添加一些解决方案后,它仍然无法工作。
错误:
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: Database operation expected to affect 1 row(s) but actually affected 0 row(s).
Data may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions.
插入代码:
public bool Insert(string UserName, SendInventoryModel sendInventoryModel)
{
using (DatabaseContext context = new DatabaseContext())
{
bool flag = false;
// Create new
InventoryEntity inventoryEntity = new InventoryEntity
{
UserName = sendInventoryModel.UserName,
Item = sendInventoryModel.Item ,
};
context.Table.Add(inventoryEntity);
context.SaveChanges();
// Check
var model = CheckUserNameID(UserName, sendInventoryModel.Item);
var data = context.Table.Find(model.Id);
if (null != data)
{
flag = true;
}
return flag;
}
}
发送库存模型:
public class SendSiteMailModel
{
[Required]
public string UserName { get; set; }
[Required]
public string Item{ get; set; }
}
库存控制器:
[HttpPost("{username}")]
[Authorize]
public JObject Post([Required] string UserName, [FromBody] SendInventoryModel sendInventoryModel)
{
ResponseModel x = new ResponseModel();
try
{
InventoryRepository InventoryRepository = new InventoryRepository();
bool isSuccess = InventoryRepository.Insert(UserName, sendInventoryModel);
}
catch (Exception error)
{
// if not successful
}
return Json(x);
}
我已经在 InventoryEntity
和 InventoryModel
中添加了 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
。
库存实体:
[Key]
DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
库存模型:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
我还在 DBContext.cs
中添加了以下代码:
public virtual DbSet<OtherTableEntity> Table{ get; set; }
public virtual DbSet<InventoryEntity> Table{ get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<OtherTableEntity>();
modelBuilder.Entity<InventoryEntity>().Property(x => x.Id).ValueGeneratedOnAdd();
base.OnModelCreating(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
最后添加我的 table 设计:库存 ID
:
(Is Identity) = Yes
Identity Increment = 1
Identity Seed = 1
请注意,清单 table 中没有 主键 。它是一个 旧的 table,具有 现有数据 。当前数据库已从 membership 迁移到 identity。
我在插入方法中添加了所有东西后 context.SaveChanges();
仍然不起作用。关于如何解决此问题的任何想法或建议?
注意:我已经根据 Asherguru 的建议更改了 table 实体名称和模型,因为它有点令人困惑和通用。
您的Table实体和数据库中的Table是否相同table名称?
为什么名称不同 - Table实体和 Table?
尝试在 Table 实体 class 中添加 [Table("YourTableNameInDatabase")]。然后 EF 可以在数据库中找到实际的 table 并插入到这个 table.
[Table("YourTableNameInDatabase")]
public partial class TableEntity
{
public int Id { get; set; }
}
如果您显示实际的 table 名称和一些必要的屏幕截图,就不会那么混乱。