由于EF不支持DELETE SET NULL,我可以在EF外部运行SQL命令吗?

时间:2015-01-12 15:24:57

标签: sql entity-framework foreign-keys

如果您希望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,我想说是的,我们可以继续并手动更改删除规则,但我不确定。我不能在这一点上进行实验,所以我很感激这个答案。

1 个答案:

答案 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");" 
}