【问题标题】:Ignore existing data when adding foreign key添加外键时忽略现有数据
【发布时间】:2021-06-02 06:30:21
【问题描述】:

我在数据库中有一个表已经有一些数据,例如这是表

public class Foo {
    public int Id {get; set;}
    public string FooTypeId {get; set;}
}

FooTypeId 不是 FK,我只是在其中存储字符串,例如 'TABLE'、'CHAIR'..

现在我想创建一个新表来保存FooType 的值,所以FooTypeId 成为外键。

所以我是这样设计的:

public class Foo {
    public int Id {get; set; }
    public string FooTypeId {get; set; }
    public virtual FooType {get; set; }
}

public class FooType {
    public string Id {get; set; }
    public string Name {get; set; }
}

没关系。但是,我已经在Foo 表('chair'、'table'、..)中有现有数据,并且我在启动时添加了新数据。所以它崩溃了。

问题是:
在这种情况下,如何忽略带有实体框架的现有数据?严格使用实体框架。

【问题讨论】:

  • 你 could disable foreign key checks 但那太傻了。如果已经存在的数据不代表有效值,那么为什么不将该数据移动到不同的列呢?
  • “忽略现有数据”到底是什么意思?如果你想ignoreFooTypeId 中的数据,那么你必须忽略列本身。但是您现在已将FooTypeId 设为外键列。因此,现在您需要此列中的 FooType 的 Id 值。您要删除/删除这些数据吗?请澄清您的要求。

标签: c# asp.net .net entity-framework entity-framework-core


【解决方案1】:

假设您正在使用迁移,您可以编辑生成的迁移“UP”方法。在此方法中,您将进行一些操作来在 Foo 中创建外键。可能是打电话给MigrationBuilder.AddForeignKey。在调用该方法之前,您可以使用MigrationBuilder.InsertData在FooType中插入需要的值,这样外键创建就不会失败。

类似的东西:

//Here should be code to create FooType table
modelBuilder.InsertData("FooType", {"Id", "Name"}, {"Varchar", "Varchar"}, {{ Id="T", Name="Table" }, { Id="C", Name="Chair" }}, "dbo");
migrationBuilderBuilder.AddForeignKey("FK_Foo_FooType", "Foo", "FooTypeId", "FooType", "dbo", "dbo", "Id", ReferentialAction.Cascade, ReferentialAction.Cascade);

【讨论】:

    【解决方案2】:

    您不能“忽略”现有数据,您必须允许它。

    1. 创建 FooType 中的所有行(包括 Foo 引用的任何数据)。
    2. 执行迁移
    3. 利润

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 2017-11-28
      • 2014-12-17
      • 2011-03-29
      相关资源
      最近更新 更多