说我有两个实体,像这样:删除相关实体在关系删除
public class Response
{
public int Id { get; set; }
public int PatientId { get; set; }
public virtual Patient Patient { get; set; }
public string Text { get; set; }
}
public class Patient
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Response> Responses { get; set; }
}
我希望能够调用
Patient.Responses.Remove(someResponse);
而且具有实体删除不但关系,但响应实体以及。目前如果我只是删除关系,我得到以下错误:
System.InvalidOperationException:操作失败:由于一个或多个外键属性是不可空的,所以无法更改关系。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性指定另一个非空值,或者必须删除不相关的对象。
阅读这篇博客http://blogs.msdn.com/b/dsimmons/archive/2010/01/31/deleting-foreign-key-relationships-in-ef4.aspx我意识到,我可以有以下映射实现这一点:
modelBuilder.Entity<Response>().HasKey(m => new { m.Id, m.PatientId });
但我不想改变我的主键。我想要做的是覆盖DbContext.SaveChanges()并标记删除任何Responses,其中患者关系已被删除。我尝试这样做:
public override int SaveChanges()
{
// Need to manually delete all responses that have been removed from the patient, otherwise they'll be orphaned.
var orphanedResponses = ChangeTracker.Entries().Where(
e => e.State == EntityState.Modified &&
e.Entity is Response &&
e.Reference("Patient").CurrentValue == null);
foreach (var orphanedResponse in orphanedResponses)
{
Responses.Remove(orphanedResponse.Entity as Response);
}
return base.SaveChanges();
}
但我发现这是可能的,只有Response.PatientId设置附加一个响应,而不是Response.Patient,实体不会有,所以我的代码认为它已经成为孤儿,并应加载Response.Patient财产被删除。
总之
我想知道的是我如何可以告诉大家,实体已经被修改,因为它的FK关系已被删除。
谢谢,但级联删除只会删除父母被删除的权利?我不删除病人,我只是想从Patient.Response中删除响应,并让实体删除响应。 – phdesign