将记录添加到数据库失败

时间:2018-08-12 10:31:41

标签: c# entity-framework asp.net-core

我有一个程序,该程序使用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;
 }

我不明白该错误。调试时,容器看起来不错,数据也看起来不错。我在做什么错了?

2 个答案:

答案 0 :(得分:0)

GitHub中有关于它的整篇文章:

  

从模型中删除.ValueGeneratedNever();以获取ID   (实际上是AutoIncrement INT主键)。

答案 1 :(得分:0)

通常,EF Core用于migrations来创建称为Code-First的表。看来您分别创建了TableModel

如果要为id手动设置CampaignCustomerMatch,请执行以下步骤:

  1. 使用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; }
    }
    
  2. 显式设置ID如下:

        _ctx.CampaignCustomerMatch.Add(new CampaignCustomerMatch { id = 1000, Url = "www.google.com" });            
        await _ctx.SaveChangesAsync();
    

如果要自动生成id,请执行以下步骤:

  1. 更改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)
    );
    
  2. 更改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();