考虑以下实体模型:
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>
是因为 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);
}
这种关系是单向的,这意味着您只能从协议中访问参与者——您不能从机构访问协议。
现在,由于协议实体的主键是动名词参与者主键的一部分,并且由于指定了级联删除,我希望将协议置于已删除状态也会导致其参与者集合中的每个实体也被放入删除状态。
在协议 DbSet 上调用 Remove 时,这似乎有效:
// this works
dbContext.Agreements.Remove(agreement);
dbContext.SaveChanges();
但是,仅将协议条目的状态设置为已删除时,它似乎不起作用:
// this causes an exception when Participants is not empty
dbContext.Entry(agreement).State = EntityState.Deleted;
dbContext.SaveChanges();
有没有办法可以定义关系,以便简单地将协议实体置于已删除状态也会导致相应的集合项实体置于已删除状态?
更新
我一直在阅读这方面的内容,并发现急切地加载 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();