【问题标题】:Entity Framework 4.0 - Many to Many relationship is inserting records on the left side of the mapping, not only in the relationship tableEntity Framework 4.0 - 多对多关系是在映射的左侧插入记录,而不仅仅是在关系表中
【发布时间】:2012-05-09 16:57:13
【问题描述】:

我在实体框架中与 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 表中,而不是在我的原因目录表中。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 2018-06-24
      • 2011-07-01
      • 1970-01-01
      • 2021-05-15
      相关资源
      最近更新 更多