繁体   English   中英

忽略 WillCascadeOnDelete 的实体框架迁移

[英]Entity framework migrations ignoring WillCascadeOnDelete

例如,看看这个问题。 实体框架 (EF) 代码优先级联删除,用于一对零或一关系

我有一个正常的上下文等。

如果我更改任何内容,我可以根据Add-Migration test生成一个新的迁移。

但是,如果我将 WillCascadeOnDelete() 从 true 更改为 false 或添加一些 true,则实体框架会忽略它。

我首先将代码与数据库中生成的模型一起使用。 在生成的模型中,一切都在WillCascadeOnDelete(false) 所以现在我将它从 false 更改为 true 但它被实体框架忽略了。

我也试过这个: http : //msdn.microsoft.com/en-us/data/jj591620.aspx#CascadeDelete

添加此行后......如果我添加Add-Migration newTest则没有任何变化。

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>()

这也被Add-Migration thirdTest

modelBuilder.Conventions.Add<OneToManyCascadeDeleteConvention>()
modelBuilder.Conventions.Add<ManyToManyCascadeDeleteConvention>()

我可以用 WillCascadeOnDelete 改变一切……它被忽略了!

如果我更改其他所有内容,它会起作用并将附加到新的迁移中...

此构造的主要类如下。

[Table("SomeToThing")]
public class SomeToThing : Base
{
    [Column("Some")]
    public Guid SomeId { get; set; }
    [ForeignKey("SomeId")]
    public virtual Some Some { get; set; }

    [Column("Thing")]
    public Guid ThingId { get; set; }
    [ForeignKey("ThingId")]
    public virtual Thing Thing { get; set; }
}

我有这个表:

  • 一些
  • 某物
  • 事物

SomeToThing有额外的变量,因为我无法将Some直接映射到Thing

我知道这个线程很旧,但我只是遇到了同样的问题。

我的解决方案是删除迁移源文件并从头开始重新搭建它。

在我第一次尝试时,我忘记设置.WillCascadeOnDelete(false) ,并且出于充分的理由,SQL Server 由于周期而拒绝了迁移。 然后,当我在OnModelCreating方法中删除级联后尝试使用相同的名称重新构建迁移时,EF 只是不会选择那些特定的更改。

然后我删除了迁移源文件并运行Add-Migration SameMigrationName 由于 MSSQL 接受了迁移脚本,级联删除已被删除,并且似乎有效。 顺便说一句,我正在使用 EF 6.1.3。

关于我遇到的问题,我想提到的一件事是我添加了以下代码(到我的“OnModelCreating”,即 DbContext):

 modelBuilder.Entity<MyEntityTwo>()
                .HasMany(e => e.MyEntityOne)
                .WithRequired(e => e.MyEntityTwo)
                .HasForeignKey(e => e.MyEntityTwoId)
                .WillCascadeOnDelete(false); 

但是我在定义 MyEntityOne 的表已经定义之后添加了这个,即在以前的迁移中。

事实证明,因为我在表已经定义之后将它添加到 OnModelCreating 中,所以当我添加一个新的迁移时,实体框架并没有“不”选择 willcascadeondelete(false)。

为了解决这个问题,我必须手动将以下内容添加到(新的)迁移中:

DropIndex(...this was created by EF for me already.  Not important...);
DropForeignKey("MyEntityOne", "<name of Foreign key goes here ie FK_MyEntityOne_...etc>");
AddForeignKey("MyEntityOne", "MyEntityTwoId", "MyEntityTwo", "Id", cascadeDelete:false);
AlterColumn(...this was created by EF for me already.  Not important...);
CreateIndex(...this was created by EF for me already.  Not important...);

通过添加AddForeignKey 行,使用cascadeDelete: false,它将重新应用带有cacade on delete false 的外键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM