实体框架5.更新多对多关系会导致违反主键

时间:2013-01-29 02:33:11

标签: entity-framework entity-framework-4 entity-framework-5

我已经看到很多像这样的问题了,但是那些人正在打电话。添加方法就多对多关系我不是。我正在使用WebApi

我想调用.Clear()然后在实体框架5中重新添加更新的实体,或者它应该是自动的,我做错了什么?

我正在使用工作单元和通用的实体框架存储库模式。

这是相关代码:

 public HttpResponseMessage Put(PromDto promDto)
{
    var creditCardsIds = string.IsNullOrEmpty(promDto.CreditCards) ? null : promDto.CreditCards.Split(',').Select(int.Parse);
    var branchesIds = string.IsNullOrEmpty(promDto.Branches) ? null : promDto.Branches.Split(',').Select(int.Parse);

    var promotion = Uow.Promotions.GetById(promDto.Id);

    promotion.CreditCards = creditCardsIds != null ? Uow.CreditCards.GetByPredicate(t => creditCardsIds.Contains(t.Id)).ToList() : null;
    promotion.Branches = branchesIds != null ? Uow.Branches.GetByPredicate(t => branchesIds.Contains(t.Id)).ToList() : null;

    if (ModelState.IsValid)
    {
        Uow.Promotions.Update(promotion);
        Uow.Commit();
        return new HttpResponseMessage(HttpStatusCode.NoContent);
    }

    throw new HttpResponseException(HttpStatusCode.BadRequest);
}

在上下文中

modelBuilder.Entity<Branch>().
    HasMany(p => p.Promotions).
    WithMany(s => s.Branches).
    Map(
    m =>
    {
      m.MapLeftKey("BranchId");
      m.MapRightKey("PromotionId");
      m.ToTable("Branch_Promotion");
    });

modelBuilder.Entity<Promotion>().
    HasMany(tt => tt.CreditCards).
    WithMany(p => p.Promotions).
    Map(
    m =>
    {
     m.MapLeftKey("PromotionId");
     m.MapRightKey("CreditCardId");
     m.ToTable("Promotion_CreditCard");
    });

我想打电话给这个吗?

promocion.CreditCards.Clear();
promocion.Branches.Clear();

提前致谢。吉列尔莫。

1 个答案:

答案 0 :(得分:0)

添加此解决了它:

var promotion = Uow.Promotions.GetByPredicateIncluding(p => p.Id == promotionDto.Id, a => a.CreditCards, a => a.Branches).ToList().FirstOrDefault();

加载相关的实体。

似乎需要加载它们才能让Entity Framework知道它们是否是新的。

如果有人有更好的解释,请随时添加任何评论。

最诚挚的问候。吉列尔莫。