繁体   English   中英

如何首先更新多对多EF代码

[英]how to update many to many EF code first

我有两个模型:

public class Exchanger : BaseContract
{
    [DataMember, Key, Column(TypeName = "bigint")]
    public long Id { get; set; }

     ....
    [DataMember]
    public virtual ICollection<PaymentSystem> PaymentSystems { get; set; }

}

 [DataContract, Serializable]
 public class PaymentSystem : BaseContract
 {
    [Key, Column(TypeName = "bigint"), DataMember]
    public long Id { get; set; }

     ...

    [DataMember, JsonIgnore]
    public virtual ICollection<Exchanger> ExchangersSupport { get; set; }

}

和流利的api方向具有多对多关系:

 modelBuilder.Entity<Exchanger>()
     .HasMany(t => t.PaymentSystems)
     .WithMany(t => t.ExchangersSupport)
     .Map(m => m.ToTable("ExchangerToPaymentSystem"));

用于插入的代码:

  public void Create(Exchanger ex, long clientId)
       {
         if (_context != null)
        {
             ex.ClientId = clientId;
             ex.LastTimeUpdated = DateTime.UtcNow;
             _context.Exchangers.Add(ex);
             _context.SaveChanges();
        }

    }

当我在Exchanger表中插入新条目时,EF在ExchangerToPaymentSystem表中创建条目,同时也会在PaymentSystem表中同时创建相同条目。 当我更新时,什么也没发生。 我做错了什么?

您的映射配置必须类似于以下针对中间表的配置:

this.ToTable("ExchangerToPaymentSystem");
            this.HasKey(e => e.Id);

            this.HasRequired(e => e.Exchanger )
                .WithMany(e => e.ExchangersSupport )
                .HasForeignKey(pc => pc.ExchangerId);


            this.HasRequired(pc => pc.PaymentSystem )
                .WithMany(p => p.PaymentSystems)
                .HasForeignKey(pc => pc.PaymentSystemId);

通常,当您的实体来自不同的数据上下文时,会发生此行为。请确保所有实体都来自同一数据上下文。

所以,当你这样做

var交换器= new Exchanger(){付款系统=付款系统,...};

它将自动为您在链接表中创建记录,这是预期的和必需的。 我不确定我现在明白问题出在哪里...

好的,我不知道我必须将PaymentSystems集合重新附加到对象上下文,它不会自动重新附加,而是标记为新(状态=已添加)。

 public void Create(Exchanger ex, long clientId)
    {
        if (_context != null)
        {
            ex.ClientId = clientId;
            ex.LastTimeUpdated = DateTime.UtcNow;

           **var ps = ex.PaymentSystems.Select(x=>x.Id);
            var ps2 = _context.PaymentSystems.Where(x => ps.Any(y => y == x.Id)).ToList();
            ex.PaymentSystems.Clear();
            foreach (var pp in ps2)
            {
                ex.PaymentSystems.Add(pp);
            }**

            _context.Exchangers.Add(ex);
            _context.SaveChanges();
        }

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM