我有一个程序,该程序使用GET调用获取一些数据,然后需要将结果插入数据库中。调用程序时出现错误:
DbUpdateConcurrencyException:数据库操作预期影响1行,但实际上影响0行。自加载实体以来,数据可能已被修改或删除。有关了解和处理乐观并发异常的信息,请参见http://go.microsoft.com/fwlink/?LinkId=527962。
我的表DDL:
CREATE TABLE [CampaignCustomerMatch](
id int NULL,
VisitorExternalId [nvarchar] (40) NULL ,
Url [nvarchar](250) NULL,
ReffererUrl [nvarchar](250) NULL,
ActivityDate [nvarchar](25) NULL
)
我的代码的一部分在最后一行失败:
var container = JsonConvert.DeserializeObject<MarkedCampaigns>(json);
foreach (var item in container.items)
{
repository.addMatch(item);
}
await repository.saveChanges();
addMatch
代码:
public void addMatch(CampaignCustomerMatch ccm)
{
_context.CampaignCustomerMatch.Add(ccm);
}
saveChanges
:
public async Task saveChanges()
{
await _context.SaveChangesAsync();
}
还有我的CampaignCustomerMatch
类:
public class CampaignCustomerMatch
{
[Key]
public int id { get; set; }
public string VisitorExternalId;
public string Url;
public string ReffererUrl;
public string ActivityDate;
}
我不明白该错误。调试时,容器看起来不错,数据也看起来不错。我在做什么错了?
答案 0 :(得分:0)
GitHub中有关于它的整篇文章:
从模型中删除
.ValueGeneratedNever();
以获取ID (实际上是AutoIncrement INT主键)。
答案 1 :(得分:0)
通常,EF Core
用于migrations
来创建称为Code-First
的表。看来您分别创建了Table
和Model
。
如果要为id
手动设置CampaignCustomerMatch
,请执行以下步骤:
使用CampaignCustomerMatch
将{ get; set; }
更改为属性,否则,在插入新记录时,它们全部为空。
public class CampaignCustomerMatch
{
[Key]
//[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int id { get; set; }
public string VisitorExternalId { get; set; }
public string Url { get; set; }
public string ReffererUrl { get; set; }
public string ActivityDate { get; set; }
}
显式设置ID如下:
_ctx.CampaignCustomerMatch.Add(new CampaignCustomerMatch { id = 1000, Url = "www.google.com" });
await _ctx.SaveChangesAsync();
如果要自动生成id
,请执行以下步骤:
更改Table
CREATE TABLE [dbo].[CampaignCustomerMatch] (
[id] INT IDENTITY (1, 1) NOT NULL,
[VisitorExternalId] NVARCHAR (MAX) NULL,
[Url] NVARCHAR (MAX) NULL,
[ReffererUrl] NVARCHAR (MAX) NULL,
[ActivityDate] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_CampaignCustomerMatch] PRIMARY KEY CLUSTERED ([id] ASC)
);
更改Model
public class CampaignCustomerMatch
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int id { get; set; }
public string VisitorExternalId { get; set; }
public string Url { get; set; }
public string ReffererUrl { get; set; }
public string ActivityDate { get; set; }
}
3。插入没有id
的记录
_ctx.CampaignCustomerMatch.Add(new CampaignCustomerMatch { Url = "www.google.com" });
await _ctx.SaveChangesAsync();