【问题标题】:Entity Framework Core: Violation of PRIMARY KEY constraint Cannot insert duplicate key in objectEntity Framework Core:违反 PRIMARY KEY 约束不能在对象中插入重复键
【发布时间】:2019-05-07 04:47:46
【问题描述】:

将记录插入子表时出现以下错误,为什么当我要求 Entity Framework Core 将记录插入子表(关键字)时,它试图将记录插入父表(IdentityUser 表)桌子)?

堆栈跟踪:

An unhandled exception occurred while processing the request.
SqlException: Violation of PRIMARY KEY constraint 'PK_IdentityUser'. Cannot insert duplicate key in object 'dbo.IdentityUser'. The duplicate key value is (39b72c3a-b5bf-43e4-84f9-5cddbe79f6e3).
The statement has been terminated.

型号:

public class Keyword
  {
    public Keyword() { }
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int KeywordId { get; set; }
    public IdentityUser User { get; set; }
    public string Value { get; set; }
    [Timestamp]
    public byte[] RowVersion { get; set; }
  }

将记录保存到关键字表的代码:

    var keywords = new List<Keyword>();
var identityUser = await UserManager.GetUserAsync(User);
              foreach (var keywordString in keywordsThatNeedToBeSaved)
              {
                keywords.Add(new Keyword()
                {
                  User = identityUser,
                  Value = keywordString
                });
              }
              ScrubberDbContext.Keywords.AddRange(keywords);
                await ScrubberDbContext.SaveChangesAsync();

【问题讨论】:

  • identityUser 存在于数据库中,当您想保存关键字时将其添加到关键字实体中,Entityframework 再次保存identityUser 并且存在然后它有错误,您应该在您的关键字实体,然后在要保存关键字实体时添加用户 ID。

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


【解决方案1】:

将关键字类更改为:

public class Keyword
    {
        public Keyword() { }
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int KeywordId { get; set; }
        public int? UserId { get; set; }
        [ForeignKey("UserId")]
        public IdentityUser User { get; set; }
        public string Value { get; set; }
        [Timestamp]
        public byte[] RowVersion { get; set; }
    }

并将保存记录更改为:

var keywords = new List<Keyword>();
 var identityUser = await UserManager.GetUserAsync(User);
              foreach (var keywordString in keywordsThatNeedToBeSaved)
              {
                keywords.Add(new Keyword()
                {
                  UserId = identityUser.Id,
                  Value = keywordString
                });
              }
              ScrubberDbContext.Keywords.AddRange(keywords);
                await ScrubberDbContext.SaveChangesAsync();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多