【问题标题】:Entity framework migrations ignoring WillCascadeOnDelete忽略 WillCascadeOnDelete 的实体框架迁移
【发布时间】:2014-12-15 15:32:44
【问题描述】:

以这个问题为例。 Entity Framework (EF) Code First Cascade Delete for One-to-Zero-or-One relationship

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

如果我更改任何内容,我可以根据 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
  • 东西

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

【问题讨论】:

  • 您可以随时编写自己的迁移
  • 是的,这就是我在 Add-Migration 不起作用后尝试的.​​..我认为这是我的失败,而不是 Add-Migration Tool 的失败...因为我问过社区 :)跨度>
  • 迁移并不是万能的。如果我没记错的话,它也不会添加唯一索引。
  • 你有一个示例迁移函数/字符串,它将外键更改为 CascadeDelete: true?提前致谢!
  • 我也遇到了这个问题,似乎当您有某种继承并尝试配置派生实体时,实体框架会无缘无故地忽略 WillCascadeOnDelete。我的场景是:我不想级联删除除一个之外的每个实体。

标签: c# entity-framework cascade


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    关于我遇到的问题,我想提一提的是,我添加了以下代码(到我的“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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      相关资源
      最近更新 更多