我正在使用Entity Framework 4.3进行代码优先开发,并且看起来似乎不可能通过属性注释或任何其他方式表达CHECK约束.我看到EF 5.0将添加对检查枚举的支持,但这并不是我在这里完成的.
举一个简单的例子,我想验证所有Person对象的名字都是"Bob"或"Harry",并且是5年,10年或30年.
public class Person
{
[Required]
[Check("Bob", "Harry")] //yes, this attribute is imaginary
public string FirstName { get; set; }
[Required, Check(5, 30, 50)] //check is still imaginary
public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我可以运行一个alter脚本来添加这些约束,然后我可以滚动自己的check属性来执行验证,但是有没有办法在Entity Framework中实际表达非枚举的CHECK约束?
是否可以在Entity Framework 7中使用流畅的API添加CHECK约束?
我需要做到这样的事情:
...
ADD CONSTRAINT CK_SomeTable_SomeColumn CHECK (SomeColumn >= X);
Run Code Online (Sandbox Code Playgroud)
如果解决方案是特定于提供者的,那就没问题 - 我只针对MsSqlServer(至少现在).
我制作了一张表格,将商店与 Table1 或 Table2(和其他信息)相关联
Id
IdStore_FK
IdTable1_FK
IdTable2_FK
SomeOtherFieldsThatDoesntMatterRightNow
Run Code Online (Sandbox Code Playgroud)
我创建了一个检查约束以确保它永远不会同时填充两个 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))
Run Code Online (Sandbox Code Playgroud)
但是我在和之后alter table 手动运行了它。我需要仅使用代码来制定这些限制,以便能够发送给我的经理。add-migrationupdate-database
我试图modelBuilder.Sql("ALTER TABLE XXX....")在Up特定迁移的方法中添加。我只能在add-migration创建文件的之后将该行添加到迁移文件中。
每次启动后的种子查询检查约束是否存在,如果不存在则创建它对我来说似乎并不酷。此外,它只会在我运行代码时运行,而不是与迁移/更新数据库一起运行。
.net c# entity-framework .net-core entity-framework-migrations