当我尝试在 Children 表中插入新项目时,EF Core 中的主键重复

问题描述 投票:0回答:1

当我在子表中插入一条新记录时,它给我一个错误,说由于主键问题,我无法执行该操作,也就是说,当我与父对象建立关联时,它尝试在父对象,考虑到子对象引用父对象而不是父对象引用子对象,这没有任何意义。 下面是我的模型的代码和实体的映射:

DbContext 映射

 protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<JackPot>().HasKey(x => x.Id);
        builder.Entity<BetEntity>().HasKey(x => x.Id);
        builder.Entity<ApplicationUserCode>().HasKey(x => x.Id);
        builder.Entity<ApplicationUser>().HasMany(c => c.Beets).WithOne(c => c.Participant).HasForeignKey(c => c.UserId).OnDelete(DeleteBehavior.ClientSetNull);
        builder.Entity<JackPot>().Property(x => x.Price).HasColumnType("smallmoney");       
        base.OnModelCreating(builder);
    }   

JackPot模型

public class JackPot : Entity
{
    public string Name { get; set; }    
    public string Instructions { get; set; }
    public decimal Price { get; set; }
    public string Description { get; set; }
    public string? ImageUrl { get; set; }
    public ApplicationUser Owner { get; set; }
    public string UserId { get; set; }
    public ICollection<BetEntity> Bets { get; set; } = new List<BetEntity>();
    public JackPot(string name, string instructions, decimal price, string description, ApplicationUser owner)
    {
        Name = name;
        Owner = owner;
        Instructions = instructions;
        Price = price;
        Description = description;        
        UserId = owner.Id;
    }

    internal JackPot()
    {

    }
}

投注实体

public class BetEntity : Entity
{
    public BetEntity(ApplicationUser participant, int beetPrice, string imageUrl) : base()
    {
        Participant = participant;
        BeetPrice = beetPrice;
        ImageUrl = imageUrl;
    }
    internal BetEntity()
    {
        
    }
    public ApplicationUser Participant { get;private set; } = new ApplicationUser();
    public string UserId { get; set; }
    public int BeetPrice { get;private set; }
    public string ImageUrl { get; private set; }
    public JackPot JackPot { get; set; } = new JackPot();
    public Guid JackPotId { get; set; }
}

应用程序用户

public class ApplicationUser : IdentityUser
{
    public ApplicationUser()
    {
        
    }
    public ICollection<JackPot> JackPots { get; set; } = new List<JackPot>();
    public ICollection<BetEntity> Beets { get; set; } = new List<BetEntity>();
    public string Name { get; set; }
    public string? ProfileUrl { get; set; }
    public string? Bio { get; set; }
}

当我使用下面的代码进行插入时:

 var aplicationUser = HttpContext.User.Claims.GetFromClaims();
            var user = await _userManager.FindByEmailAsync(aplicationUser.Email ?? string.Empty);
            if (user is null)
            {
                return NotFound("Lamentablemente, no se ha encontrado ningún usuario con esa información. Por favor, verifica los datos ingresados o regístrate para crear una nueva cuenta.");
            }
            var jackPot = new JackPot(newJackPotViewModel.Name, newJackPotViewModel.Instructions, newJackPotViewModel.Price, newJackPotViewModel.Description, user);
            await _jackpotRepository.Add(jackPot);

我在 Cath 中遇到以下异常:

Violation of PRIMARY KEY constraint 'PK_AspNetUsers'. Cannot insert duplicate key in object 'dbo.AspNetUsers'. The duplicate key value is (67bed5d8-2832-444e-b08f-0b1852e59289). The statement has been terminated.

当我尝试创建一个新的 JackSpot 将登录用户与其关联时,Ef 试图在用户表中使用相同的 Id 进行新插入,这是错误的,因为我只是希望用户拥有引用。我什至为这个微不足道的错误道歉,但自从我使用 EF 以来已经有一段时间了,但对于这个项目来说,这是我最终选择的最可行的选择,通常我使用 NoSql 数据库或 RepoDB。

我希望在 JackPot 表中进行插入时,JackPot 具有用户引用。

c# entity-framework entity-framework-core mapping
1个回答
0
投票
  1. EF类是POCO(Plain Old CLR Objects)类,因此它们不需要继承自“Entity”类。

  2. 创建类时的一个好规则是定义一个“Int”类型的属性(全名以“Id”结尾),以指出 int 类型的属性将是主键。

因此,如果您的 JackPot 类(以及其他类)中有一个名为“Id”(int 类型)的属性,则无需编写:

builder.Entity().HasKey(x => x.Id);

在您的 OnModelCreating 方法中,因为 EF 已经知道这将是主键。

同样,您也应该应用于其他类的主键。

© www.soinside.com 2019 - 2024. All rights reserved.