Code First可以为空的外键属性

时间:2014-07-21 13:47:34

标签: entity-framework dbcontext

我想知道在dbcontext上声明'外键'属性的正确方法是什么。让我们假设这种情况:

模特:

<Display(Name:="IdProduct_fk", Prompt:="IdProduct_fk", Description:=".")> _
<Required(ErrorMessage:="Mandatory")> _
Public Property IdProduct_fk As Integer
Public Property Product As Product

流利的api:

    modelBuilder.Entity(Of HI_Conciliacio) _
                .HasRequired(Function(x) x.Product) _
                .WithMany(Function(t) t.MEs) _
                .HasForeignKey(Function(m) m.IdProduct_fk) _
                .WillCascadeOnDelete(False)    

在这种情况下,IdProduct_fk可以定义为IntegerInteger?,我认为两者都是有效的。我的问题是:

  1. 如果属性声明为Ingeger,则它具有所有时间值,在创建时也具有0值。这对我来说似乎很脏(或不是?)
  2. 如果property设置为Integer?,那么我没有'0'值问题但是,删除实体时值将被删除为Null(当我执行ctx.mes.remove(someMeEntity)时)。我需要知道它在savechanges上的价值,因为我在delete上做了一个验证实体(我在上下文中覆盖了ShouldValidateEntity方法),我需要知道所有外键值。
  3. 然后,什么是正确的解决方案?

2 个答案:

答案 0 :(得分:1)

如果一个子(HI_Conciliacio)有一个必需的(Product)父级(这是你在fluent API中定义关系的方式)那么外键的null或零值永远不会使用(或传递数据库更新),因此您也可以使用Integer代替Integer?

如果您不使用流畅的API声明,那么使用Integer将向Enity Framework发出需要关系的信号,如果它是Integer?,则该关系是可选的,并且所有子实体当父产品被删除时,由上下文(!)加载的ProductId将设置为null。

答案 1 :(得分:0)

如果您的外键在数据库中不能为空,那么最好在代码中镜像该行为。您的.HasRequired()将确保始终设置。