当我在子表中插入一条新记录时,它给我一个错误,说由于主键问题,我无法执行该操作,也就是说,当我与父对象建立关联时,它尝试在父对象,考虑到子对象引用父对象而不是父对象引用子对象,这没有任何意义。 下面是我的模型的代码和实体的映射:
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 具有用户引用。
EF类是POCO(Plain Old CLR Objects)类,因此它们不需要继承自“Entity”类。
创建类时的一个好规则是定义一个“Int”类型的属性(全名以“Id”结尾),以指出 int 类型的属性将是主键。
因此,如果您的 JackPot 类(以及其他类)中有一个名为“Id”(int 类型)的属性,则无需编写:
builder.Entity().HasKey(x => x.Id);
在您的 OnModelCreating 方法中,因为 EF 已经知道这将是主键。
同样,您也应该应用于其他类的主键。