我有这个模型(简化):
public class Request
{
[Key]
public int Id { get; set; }
public virtual StructuredNote Response { get; set; }
}
每个StructuredNote
都有List<CallSchedComp>
,如下所示:
public class StructuredNote
{
public virtual List<CallSchedComp> CallSchedule { get; set; }
}
我想更新特定的Request
&#39; CallSchedule
。问题通常是我需要完全重新生成CallSchedule
,而不是修改现有的引用CallSchedule
。当重新生成一个全新的List<CallSchedComp>
时,显然指针现在是新的,因此当我执行以下操作时会发生什么:
request.Response.CallSchedule = NewCallScheduleWithNewPointer;
_ctxt.Entry(request).State = EntityState.Modified;
EF是否将CallSchedComp
的现有List<CallSchedule>
部分的FK设置为null
,而不是将其从数据库中删除。新的CallSchedComp
具有指向Response
的正确FK。我相信这是默认的EF行为,对吧?
我的问题:
List<CallSchedComp>
而不是只将其外键设置为null? 希望很清楚。谢谢!
编辑:根据要求:
public class CallSchedComp
{
[Key]
public int CallSchedCompId { get; set; }
[Range(typeof(DateTime), "1/1/1900", "6/6/2079")]
public DateTime ObservationDate { get; set; }
[Range(typeof(DateTime), "1/1/1900", "6/6/2079")]
public DateTime PaymentDate { get; set; }
public decimal Coupon { get; set; }
public decimal Strike { get; set; }
public OptionType OptionType { get; set; }
public CallType CallType { get; set; }
public decimal CallPrice { get; set; }
public decimal AutoCallLevel { get; set; }
public decimal UpsideStrike { get; set; }
public decimal UpsideParticipation { get; set; }
public bool ExcessParticipationOnAutoCallOnly { get; set; }
public virtual StructuredNote IncomeNote { get; set; }
[Timestamp]
public byte[] Timestamp { get; set; }
}
非常基本的fluentAPI配置。我几乎完全使用了注释来配置关系。
modelBuilder.Entity<CallSchedComp>().Property(x => x.AutoCallLevel).HasPrecision(18, 4);
modelBuilder.Entity<CallSchedComp>().Property(x => x.CallPrice).HasPrecision(18, 4);
modelBuilder.Entity<CallSchedComp>().Property(x => x.Coupon).HasPrecision(18, 4);
modelBuilder.Entity<CallSchedComp>().Property(x => x.Strike).HasPrecision(18, 4);
modelBuilder.Entity<CallSchedComp>().Property(x => x.UpsideParticipation).HasPrecision(18, 4);
modelBuilder.Entity<CallSchedComp>().Property(x => x.UpsideStrike).HasPrecision(18, 4);
答案 0 :(得分:1)
情况就是这样。在CallSchedComp
类中,您只有导航属性IncomeNote
,但没有明确的FK属性,没有数据注释,也没有关系的流畅配置。因此,按照惯例,关系的许多方面是可选的(具有可空的FK)和级联行为,EF通过将FK列设置为null
来处理您描述的方式。
让EF级联删除相关记录以使IncomeNote
成为必需的唯一方法:
modelBuilder.Entity<CallSchedComp>()
.HasRequired(e => e.IncomeNote)
.WithMany(e => e.CallSchedule)
.WillCascadeOnDelete();