我在POCOS的实体框架中有一个ManyToMany关系。
我有一个名为Transaction的表,它有一个TransactionId列和一些其他列,这是我要插入的实体,一个名为Reason的表,它是一个具有ReasonId和ReasonDescription列的目录表,我也有一个表调用Transaction_Reason来保存关系,这个表有2列名为ReasonId,TransactionId有外键到各自的表。
在我的EF Transation配置中,我在构造函数中有以下内容:
base.HasKey(t => new { t.TransactionId }).HasMany(c => c.Reasons).WithMany(r => r.Transactions)
.Map(t =>
{
t.MapRightKey("ReasonId");
t.MapLeftKey("TransactionId");
t.ToTable("Transaction_Reason");
});
关系正确完成,我在Transaction_ReasonTable中插入了记录,但每当我检查Reasons表时,我也会得到这里创建的记录,这时只能是一个目录表。
继承我的插入代码:
if (reasons != null)
{
foreach (var item in reasons)
{
Reason reason = _reasonReopository.Find(item);
transaction.Reasons.Add(reason);
}
}
transaction = this._repository.Create(transaction);
this._repository.Commit();
我只想在我的事务表中插入记录,这是我在Save方法和Transaction_Reason表中创建的记录,其中保存了关系,而不是我的Reason目录表。
有人知道如何避免这种情况吗?
答案 0 :(得分:0)
原因:)是:您通过reason
获取_reasonReopository.Find(item)
个实例,它使用自己的上下文实例。 transaction
将this._repository.Create(transaction)
添加到另一个上下文中,但此上下文不会“知道”reason
中的transaction
个实例,并将它们作为新项目插入。
您可以通过两种方式解决此问题:
reason
相同的上下文中获取transaction
个实例。reason
Reasons
个实例附加到transaction
DbSet
我更喜欢第一个选项,但由于您似乎每个实体的选项2选项2可能在您的情况下效果最佳。但是,我会考虑将您的存储库重构为每个“聚合”的存储库,其中聚合是一些逻辑相关的实体。但是,在聚合之间绘制边界可能是主观的。