0

私は2つのモデルを持っています:

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 テーブルにも同じエントリが同時に作成されます。私が更新しているとき、何も起こりません。私は何を間違っていますか?

4

3 に答える 3

0

だから、あなたがするとき

var exchange = new Exchanger(){PaymentSystems = PaymentSystems、...};

リンクテーブルにレコードが自動的に作成されます。これは予期されたものであり、必須です。私は今問題が何であるかを完全に理解しているわけではありません...

于 2012-11-15T12:58:45.450 に答える
0

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

    }
于 2012-11-15T13:33:20.437 に答える
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);

多くの場合、この動作は、エンティティが異なるデータ コンテキストから取得された場合に発生します。すべてのエンティティが同じデータ コンテキストからのものであることを確認してください。

于 2012-11-15T12:51:56.777 に答える