是否有可能在使用nocheck约束的代码优先迁移中更改表?除了通过Update-Database -Script
获取SQL脚本并修改sql语句之外,我还没有找到任何方法来执行此操作。实体框架代码优先迁移NOCHECK约束?
1
A
回答
4
您可以尝试创建自己的MigrationSqlGenerator
与迁移使用它(您可以在DbMigrationsConfiguration
设置自定义SQL生成器) - 我认为它应该是足够的继承SqlServerMigrationSqlGenerator
并添加外键=覆盖Generate(AddForeignKeyIperation operation)
之后添加NOCHECK
。
无论如何,使用NOCHECK
与EF是灾难的方式。如果你想拥有没有检查约束的数据库,不要使用EF,因为每次达到不一致时它都会崩溃。
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]");
0
如果目标是创建一个要求外国但由于现有数据,更新数据库失败,只需分两步完成。例如,假设我想在PLAYER类中为TEAM添加一个外键,以1:m的关系将所有玩家分配给一个团队。假设所有类都有整数标识主键... 1.将通常的两个属性添加到PLAYER,但使用可为空的int作为外键。即:
public int? TeamID { get; set; }
public virtual Team Team { get; set; }
添加迁移,并更新数据库。所有TeamID值将为空,但您将被允许创建关系。
- 接下来,修正您的数据,以便为每个玩家分配一个有效的TeamID。如果您正在播放玩家数据,则还需要在那里提供TeamID值。
修改PLAYER类,使int不再为空:
public int TeamID {get;组; }
添加另一个迁移并再次更新数据库。你应该很好走。
相关问题
- 1. 实体框架 - 代码优先迁移:现有约束条件
- 2. 调试代码优先实体框架迁移代码
- 3. 实体框架代码优先一对一约束冲突
- 4. 创建与实体框架代码优先约束或键ApplicationUser
- 5. 实体框架中的唯一键约束代码优先
- 6. 用实体框架代码优先定义外键约束
- 7. 从LINQ到SQL到实体框架的迁移“代码优先”
- 8. 使用代码优先迁移和实体框架
- 9. 实体框架代码优先自动模式迁移
- 10. 代码优先迁移实体框架种子错误
- 11. 实体框架代码优先 - Firebird迁移:否MigrationSqlGenerator?
- 12. 实体框架代码优先迁移错误
- 13. 实体框架代码优先:启用的迁移错误
- 14. 实体框架5代码优先迁移准备生产?
- 15. 实体框架代码优先迁移的例外
- 16. 合并多个迁移实体框架代码优先
- 17. 实体框架代码首先迁移和数据迁移
- 18. 无法迁移实体框架中的AspNetUser实体.NET代码优先方法
- 19. 实体框架代码优先 - 初始代码迁移不起作用
- 20. 实体框架建模代码优先
- 21. 实体框架代码优先使用
- 22. 实体框架代码优先映射
- 23. 实体框架,代码优先和datetimes
- 24. 与实体框架代码优先
- 25. 在实体框架代码优先4.1
- 26. 映射实体框架“代码优先”
- 27. 实体框架代码优先 - 界面
- 28. 实体框架 - 代码优先Fluent API:ErrorMessage?
- 29. 实体框架代码优先的NullReferenceException
- 30. 实体框架 - 代码优先方法
感谢您的回答。我非常了解使用NOCHECK的风险,相关的变化是相当小的,我相信nocheck是我的唯一方法。我将检查MigrationSqlGenerator。 –