我想知道在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
可以定义为Integer
或Integer?
,我认为两者都是有效的。我的问题是:
Ingeger
,则它具有所有时间值,在创建时也具有0值。这对我来说似乎很脏(或不是?)Integer?
,那么我没有'0'值问题但是,删除实体时值将被删除为Null(当我执行ctx.mes.remove(someMeEntity)时)。我需要知道它在savechanges上的价值,因为我在delete上做了一个验证实体(我在上下文中覆盖了ShouldValidateEntity方法),我需要知道所有外键值。然后,什么是正确的解决方案?
答案 0 :(得分:1)
如果一个子(HI_Conciliacio
)有一个必需的(Product
)父级(这是你在fluent API中定义关系的方式)那么外键的null或零值永远不会使用(或传递数据库更新),因此您也可以使用Integer
代替Integer?
。
如果您不使用流畅的API声明,那么使用Integer
将向Enity Framework发出需要关系的信号,如果它是Integer?
,则该关系是可选的,并且所有子实体当父产品被删除时,由上下文(!)加载的ProductId
将设置为null。
答案 1 :(得分:0)
如果您的外键在数据库中不能为空,那么最好在代码中镜像该行为。您的.HasRequired()
将确保始终设置。