实体框架4.0 - 多对多关系是在映射的左侧插入记录,而不仅仅是在关系表中

时间:2012-05-09 16:57:14

标签: .net entity-framework entity-framework-4 many-to-many

我在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目录表。

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

1 个答案:

答案 0 :(得分:0)

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

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

  • 在与reason相同的上下文中获取transaction个实例。
  • reason
  • 的上下文中将Reasons个实例附加到transaction DbSet

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