实体框架无法在对象中插入重复键

Posted

技术标签:

【中文标题】实体框架无法在对象中插入重复键【英文标题】:Entity Framework Cannot insert duplicate key in object 【发布时间】:2015-01-06 16:21:25 【问题描述】:

找不到我的问题的解决方案。对不起,如果我重复了这个问题。

我在实体框架代码中具有第一个一对多的关系:

[DataContract(IsReference = true)]
public class PricingPlan


    public PricingPlan()
    
        UserProfiles = new List<UserProfile>();
    

    [Key]
    [DataMember]
    public Guid PricingPlanId  get; set; 

    [DataMember]
    public string Type  get; set; 

    public ICollection<UserProfile> UserProfiles  get; set; 


[DataContract(IsReference = true)]
public class UserProfile : IdentityUser

    public DateTime JoinedOn  get; set; 
    public DateTime LastVisited  get; set; 
    public string Location  get; set; 

    public Guid PricingPlanId  get; set; 
    public PricingPlan PricingPlan  get; set; 

在 PricingPlan 表中,我有 2 行 Free 和 Pro

当用户注册时,我想将他添加到免费计划:

    [AllowAnonymous]
    [Route("Register")]
    public async Task<IHttpActionResult> Register(RegisterBindingModel model)
    
        if (!ModelState.IsValid)
        
            return BadRequest(ModelState);
        

        PricingPlan pp = UnitOfwork.PricingPlanRepository.FirstOrDefault(v => v.Type == "Free");

        UserProfile user = new UserProfile
        
            UserName = model.UserName,
            Email = model.Email,
            EmailConfirmed = false,
            Location = model.Location,
            JoinedOn = DateTime.Now,
            LastVisited = DateTime.Now,
            PricingPlanId = pp.PricingPlanId,
            PricingPlan = pp
        ;

        IdentityResult identityResult = await UserManager.CreateAsync(user, model.Password);

我正在从 Db 获取现有计划并将其添加到 userProfile 属性,但是当 UserManager 尝试创建用户时,我遇到了异常:

违反主键约束“PK_dbo.PricingPlans”。不能 在对象“dbo.PricingPlans”中插入重复键。重复键 值为 (a5139db8-64c1-49a2-97ef-55009259dc23)。\r\n语句有 被终止了。”

OnModelCreating 我有这个代码:

  modelBuilder.Entity<UserProfile>().HasRequired<PricingPlan>(r=>r.PricingPlan).WithMany(c => c.UserProfiles).HasForeignKey(a=>a.PricingPlanId);

首先在实体框架代码中以一对多关系将现有实体添加到新实体的正确方法是什么?

【问题讨论】:

你不需要这条线:PricingPlan = pp,你已经通过添加PricingPlanId = pp.PricingPlanId来建立关系 这完全不是 EF 问题。问题是您在数据库上插入了重复的键。阅读错误消息可以清楚地说明这一点。 实际上添加了 PricingPlan = pp,因为当我想使用 PricingPlan 获取 UserProfile 时 - 它为 null,但 LazyLoading 为 false 我现在,那不是EF的问题,问题是怎么加? 我在 db 中有现有对象,我只想将它映射到新的 UserProfile。而当我想获取 UserProfile 时,它​​必须是 PricingPlan(not null) in property 【参考方案1】:

好的,我解决了这个问题。

我删除了PricingPlan = pp,就像 Markpsmith 说的那样。然后,当我想要获取带有附加实体定价计划的 UserProfile 时, 我只是做包括:

this.Context.Set<UserProfile>().Include("PricingPlan").

但是不能理解,为什么默认不包含, 当LazyLoading is set to false.

【讨论】:

默认情况下,Entity Framework 4 使用延迟加载。您可以使用以下代码禁用它: context.Configuration.LazyLoadingEnabled = false;完成此操作后,如果未明确包含相关集合,例如我们示例中 Post 的 Comments 属性,它们将为空。。来自here

以上是关于实体框架无法在对象中插入重复键的主要内容,如果未能解决你的问题,请参考以下文章

具有过滤索引的实体框架 - “无法在对象中插入重复的键行”

如何在不违反主键约束的情况下插入具有循环引用的实体框架

违反 PRIMARY KEY 约束“PK_EMPLOYEE”。无法在对象中插入重复键

具有实体框架 6 的 ObjectContext 在现有相关实体上插入重复项

实体框架:多对多插入重复

使用实体框架添加记录时违反链接记录的PRIMARY KEY约束