entity-framework - DbSet.Remove 和 DbContext.Entry(entity).State = EntityState.Deleted 之间的区别

标签 entity-framework entity-framework-4 entity-framework-4.1 entity-framework-4.2

考虑以下实体模型:

public class Agreement : Entity
{
    public int AgreementId { get; set; }
    public virtual ICollection<Participant> Participants { get; set; }
}

public class Establishment : Entity
{
    public int EstablishmentId { get; set; }
}

public class Participant : Entity
{
    public int AgreementId { get; set; }
    public virtual Agreement Agreement { get; set; }

    public int EstablishmentId { get; set; }
    public virtual Establishment { get; set; }

    public bool IsOwner { get; set; }
}

没有直接ICollection<Establishment>的原因协议(protocol)实体上是因为 IsOwner 属性,它进一步定义了这种多对多关系。

关系映射如下:
internal ParticipantOrm()
{
    ToTable(typeof(Participant).Name);

    HasKey(k => new { k.AgreementId, k.EstablishmentId });

    HasRequired(d => d.Agreement)
        .WithMany(p => p.Participants)
        .HasForeignKey(d => d.AgreementId)
        .WillCascadeOnDelete(true);

    HasRequired(d => d.Establishment)
        .WithMany()
        .HasForeignKey(d => d.EstablishmentId)
        .WillCascadeOnDelete(true);
}

这种关系是单向的,这意味着您只能从协议(protocol)中访问参与者——您不能从机构访问协议(protocol)。

现在,由于协议(protocol)实体的主键是动名词参与者主键的一部分,并且由于指定了级联删除,我希望将协议(protocol)置于已删除状态也会导致其参与者集合中的每个实体也被放入删除状态。

在协议(protocol) DbSet 上调用 Remove 时,这似乎有效:
// this works
dbContext.Agreements.Remove(agreement);
dbContext.SaveChanges();

但是,仅将协议(protocol)条目的状态设置为已删除时,它似乎不起作用:
// this causes an exception when Participants is not empty
dbContext.Entry(agreement).State = EntityState.Deleted;
dbContext.SaveChanges();

有没有办法可以定义关系,以便简单地将协议(protocol)实体置于已删除状态也会导致相应的集合项实体置于已删除状态?

更新

我一直在阅读这方面的内容,并发现急切地加载 Participants 集合并没有帮助:
// eager loading does not help, this still breaks
var agreement = dbContext.Set<Agreement>()
    .Include(a => a.Participants)
    .FirstOrDefault();
dbContext.Entry(agreement).State = EntityState.Deleted;
dbContext.SaveChanges();

最佳答案

最终通过调用以下方法解决了这个问题:

dbContext.Set<Agreement>().Remove(agreement);

我想摆脱 Agreements DbContext 上的属性(property),这就是为什么我试图用 Entry(agreement).State = EntityState.Deleted .

关于entity-framework - DbSet.Remove 和 DbContext.Entry(entity).State = EntityState.Deleted 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11584399/

相关文章:

asp.net - 在数据访问层使用HttpContext

c# - AutoMapper 和 EF 实体 - 忽略所有关系

c# - 数据库中已经有一个名为 '__MigrationHistory' 的对象

c# - EntityFramework CreatedOn 属性只能在 SaveChanges 方法中设置

c# - 组合框和 Entity Framework

c# - 使用外键属性或导航属性查询?英孚 4.1

c# - Entity Framework Core 尝试更新模型中标记为身份的列

c# - EntityContainer 名称在不同的程序集中必须是唯一的?

entity-framework - 分离 Entity Framework poco 和 objectcontext

c# - Entity Framework 4.1 - RequiredAttribute 的真正含义是什么?