【问题标题】:Entity constraint "check" with code-first使用代码优先的实体约束“检查”
【发布时间】:2018-07-19 10:07:27
【问题描述】:

我制作了一个表格,将商店与 Table1 OR Table2(和其他信息)相关联

Id
IdStore_FK
IdTable1_FK
IdTable2_FK
SomeOtherFieldsThatDoesntMatterRightNow

我创建了一个检查约束以确保它永远不会同时填充两个 FK,并且必须只填充其中一个(XOR):

ALTER TABLE TABLE0 ADD CHECK ((IdTable1_FK IS NULL AND IdTable2_FK IS NOT NULL) OR (IdTable1_FK IS NOT NULL AND IdTable2_FK IS NULL))

但我在 add-migrationupdate-database 之后手动运行了 alter table。我需要使用纯代码开发这些限制,以便能够发送给我的经理。

我如何告诉实体框架仅使用我的代码来创建它?
是否有任何 DataAnnotation 可以做到这一点?

我尝试在特定迁移的方法Up 中添加modelBuilder.Sql("ALTER TABLE XXX....")。我只能将该行添加到迁移文件之后 add-migration,这会创建文件。

每次启动后进行种子查询,检查约束是否存在,如果不存在则创建它对我来说似乎并不酷。此外,它只有在我运行代码时才会运行,而不是在迁移/更新数据库中运行。

【问题讨论】:

  • @kettch 我之前确实看到过这个问题,这就是让我尝试modelBuilder.Sql("...") 的原因。但早在 2012 年,还没有 .Net Core。只是想也许 EntityFramework 可以在对 Core 进行返工后实现它。 (EF 6.1 实现了一种使用注释创建索引的方法)

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


【解决方案1】:

仅使用代码是无法做到的。但是,您可以利用 EF 迁移过程到 run arbitrary SQL。你也可以run sql during the database initialization,以防你需要从一个新的数据库开始。

话虽如此,a custom validation attribute 可能仍然是一个好主意,这样您就可以更早地发现错误。

对不起,元答案,但这些是过去帮助过我的资源。

【讨论】:

  • 我实际上很喜欢你链接的that 方法,它似乎只在数据库初始化时运行,而不是每次我启动我的应用程序时,都会检查如何在 Core 上实现它。我不认为自定义验证对我有用,因为它显然只适用于 ONE 属性(我有 IdTable1_FK 和 IdTable2_FK,一个验证取决于另一个)
猜你喜欢
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多