2

我有一个实体。Mandate. 每个任务都有一个 required:many 与 Person (NavigationProperty) 的关系。我将 DbContext API 与(LazyLoadingEnabled、AutoDetectChangesEnabled、ValidateOnSaveEnabled、ProxyCreationEnabled)一起使用

现在我想删除一个 Mandate 实体。授权实体由另一个上下文加载AsNoTracking()

message.Result.
    ObserveOn(On<DataComposition>.Scheduler).
    Where(r => r).
    Subscribe(_ =>
    {
        using (var unit = UnitOfWork.Begin())
        {
            var mandate = this.SelectedItem.OriginalEntity;

            this.mandateRepository.Attach(mandate);
            // mandate.Person.ToString();

            this.mandateRepository.Delete(mandate);

            unit.Commit();
        }

        this.List.RemoveOnUi(this.SelectedItem);
    });

现在在提交期间,我得到以下异常:Entities in 'CodeFirstContainer.Mandates' participate in the 'Mandate_Person' relationship. 0 related 'Mandate_Person_Target' were found. 1 'Mandate_Person_Target' is expected.

如果我在填充/选择期间包含 Person 属性,或者如果我访问该属性(延迟加载),则删除工作有效,但我不喜欢仅在删除情况下实现/保留许多实体,并且我不喜欢触发多个单个DELETE查询分贝!

4

1 回答 1

2

事实上,如果您mandate.Person填充了导航属性,则以下 SQL 语句...

delete [dbo].[Mandates]
where (([Id] = @0) and ([PersonId] = @1))

...被发送到数据库,让我认为导航属性确实必须填充有正确PersonId删除父级的人。

我不知道为什么实体框架不发送带有主键的删除语句......

delete [dbo].[Mandates]
where ([Id] = @0)

……正如我所料。

编辑

如果Mandate实体具有导航属性的外键属性PersonIdPerson则将预期的 SQL(上面的第二个)发送到数据库。在这种情况下,Person导航属性可以null,而 FK 属性的值PersonId无关紧要。

编辑 2

如果您不想以 DB-roundtrip-costs 最少的方式引入 FK 属性,则可能是获取该人的 Id,然后在内存中使用该密钥创建一个虚拟人:

// ...
var personId = context.Mandates
    .Where(m => m.Id == mandate.Id)
    .Select(m => m.Person.Id)
    .Single();

mandate.Person = new Person { Id = personId };

this.mandateRepository.Attach(mandate);
this.mandateRepository.Delete(mandate);
// ...
于 2011-10-21T18:07:57.253 回答