实体框架删除相关条目而不是设置为空FK

时间:2016-12-15 16:24:21

标签: c# sql-server asp.net-mvc entity-framework

我有这个模型(简化):

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行为,对吧?

我的问题:

  1. 有没有办法删除数据库中的旧List<CallSchedComp>而不是只将其外键设置为null?
  2. 如果它不影响性能,我是否应该为此烦恼?
  3. 希望很清楚。谢谢!

    编辑:根据要求:

     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);
    

1 个答案:

答案 0 :(得分:1)

情况就是这样。在CallSchedComp类中,您只有导航属性IncomeNote,但没有明确的FK属性,没有数据注释,也没有关系的流畅配置。因此,按照惯例,关系的许多方面是可选的(具有可空的FK)和级联行为,EF通过将FK列设置为null来处理您描述的方式。

让EF级联删除相关记录以使IncomeNote成为必需的唯一方法:

modelBuilder.Entity<CallSchedComp>()
    .HasRequired(e => e.IncomeNote)
    .WithMany(e => e.CallSchedule)
    .WillCascadeOnDelete();