实体框架无法在对象中插入重复键
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”。无法在对象中插入重复键