0

我在实体框架中与 POCOS 建立了多对多关系。

我有一个名为 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 中插入了记录,但是每当我检查原因表时,我也会在这里创建记录,而这应该只是一个目录表。

这是我的插入代码:

                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 表中创建的记录,而不是在我的原因目录表中。

有人知道如何避免这种情况吗?

4

1 回答 1

0

原因:) 是:您reason通过 获取实例_reasonReopository.Find(item),它使用自己的上下文实例。被transaction添加到另一个上下文中this._repository.Create(transaction),但是这个上下文不“知道” 中的reason实例,transaction并善意地将它们作为新项目插入。

您可以通过两种方式解决此问题:

  • 获取reasontransaction.
  • reason实例附加到ReasonsDbSet 的上下文中transaction

我更喜欢第一个选项,但是由于您似乎每个实体都有存储库,因此选项 2 可能最适合您的情况。但是,我会考虑将您的存储库重构为每个“聚合”的存储库,其中聚合是许多逻辑相关的实体。但是,在聚合之间绘制边界可能是主观的。

于 2012-05-10T09:31:15.347 回答