如果您希望FK可以为空,我知道您在实体中设置了一个可以为空的密钥:
class ChildEntity
{
// Other properties not shown for brevity
public int? ParentId { get; set; }
public virtual ParentEntity Parent; { get; set; }
}
这将导致可以为空的FK。建议here我们还应该在Fluent中设置可选关系:
modelBuilder.Entity<ChildEntity>()
.HasOptional(c => c.Parent)
.WithMany()
.HasForeignKey(c => c.ParentId);
但是这仍然没有设置delete set null。 FK ParentId仍将删除设置为无操作。
本文后面有人建议我们应该在Configuration类的Seed方法中运行SQL命令?我不确定这是否有问题,但我经常运行Update-Database,而且我会来回更改此设置。
那么,是否安全,“落后于EF后面”并在SQL Management Studio(或其他应用程序)中将删除规则更改为SET NULL?由于我们在普通SQL语言的种子方法中使用SqlCommand,我想说是的,我们可以继续并手动更改删除规则,但我不确定。我不能在这一点上进行实验,所以我很感激这个答案。
答案 0 :(得分:3)
该示例将sql置于Seed
方法中,这意味着每次调用Update-Database
时它都会运行。您可以通过在迁移中使用Sql
方法修改数据库来避免这种情况。这样它只运行一次。
public void Up()
{
Sql(@"ALTER TABLE Products DROP CONSTRAINT Product_Category");
Sql(@"ALTER TABLE Products ADD CONSTRAINT Product_Category
FOREIGN KEY (CategoryId) REFERENCES Categories (CategoryId)
ON UPDATE CASCADE ON DELETE SET NULL");"
}