如何首先更新多个到多个EF代码

时间:2012-11-15 12:22:36

标签: c# entity-framework asp.net-mvc-4

我有两种模式:

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表中插入新条目时,在ExchangerToPaymentSystem表中创建条目,同时它也会在PaymentSystem表中创建相同的条目。 当我更新时,没有任何反应。 我做错了什么?

3 个答案:

答案 0 :(得分:0)

你的映射配置必须像中间表一样:

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);

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

答案 1 :(得分:0)

所以,当你这样做时

var exchanger = new Exchanger(){PaymentSystems = paymentSystems,...};

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

答案 2 :(得分:0)

好吧,我不知道我必须将PaymentSystems集合重新连接到Object Context,它不是自动重新连接,而是标记为新的(state = added)。

 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();
        }

    }