我有两种模式:
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表中创建相同的条目。 当我更新时,没有任何反应。 我做错了什么?
答案 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();
}
}