[英]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.