1

是否可以在没有检查约束的代码优先迁移中更改表?Update-Database -Script除了通过获取 SQL 脚本和修改 sql 语句之外,我还没有找到任何方法来做到这一点。

4

3 回答 3

6

您可以尝试创建自己的MigrationSqlGenerator并将其与迁移一起使用(您可以在 中设置自定义 SQL 生成器) - 我认为在添加外键 = 覆盖后继承和添加DbMigrationsConfiguration应该足够了。SqlServerMigrationSqlGeneratorNOCHECKGenerate(AddForeignKeyIperation operation)

无论如何NOCHECK与EF一起使用是灾难的方式。如果您想拥有没有检查约束的数据库,请不要使用 EF,因为每次达到不一致时它都会崩溃。

于 2012-09-25T08:35:43.870 回答
3

在一次性情况下执行此操作的另一种方法是调用 SQL 以手动创建 FK,就像这样,从您的Up()方法中:

// AddForeignKey("dbo.EFElementGroupEntries", "ConstraintCode", "dbo.EFElementConstraints", "Code");
Sql(@"ALTER TABLE [dbo].[EFElementGroupEntries]  WITH NOCHECK 
        ADD CONSTRAINT[FK_dbo.EFElementGroupEntries_dbo.EFElementConstraints_ConstraintCode] FOREIGN KEY([ConstraintCode])
        REFERENCES[dbo].[EFElementConstraints]([Code])");
Sql(@"ALTER TABLE [dbo].[EFElementGroupEntries] CHECK CONSTRAINT [FK_dbo.EFElementGroupEntries_dbo.EFElementConstraints_ConstraintCode]");
于 2016-05-04T19:29:30.093 回答
3

如果目标是创建所需的外键,但更新数据库由于现有数据而失败,只需分两个阶段进行。例如,假设我想在 PLAYER 类中为 TEAM 添加一个外键,以实现 1:m 关系,其中必须将所有玩家分配到一个团队。假设所有类都有整数标识主键... 1. 将通常的两个属性添加到 PLAYER,但使用可为空的 int 作为外键。IE:

    public int? TeamID { get; set; }

    public virtual Team Team { get; set; }
  1. 添加迁移并更新数据库。所有 TeamID 值都将为空,但您可以创建关系。

    1. 接下来,修复您的数据,以便为每个玩家分配一个有效的 TeamID。如果您正在播种球员数据,您还需要在此处提供 TeamID 值。
    2. 修改 PLAYER 类,使 int 不再可以为空:

      公共 int TeamID { 获取;放; }

    3. 添加另一个迁移并再次更新数据库。你应该很高兴。

于 2016-10-31T16:56:07.227 回答