Entity Framework 6 Code First 方法 - 唯一约束不起作用
Posted
技术标签:
【中文标题】Entity Framework 6 Code First 方法 - 唯一约束不起作用【英文标题】:Entity Framework 6 Code First approach - unique constraint doesn't work 【发布时间】:2015-06-07 22:00:25 【问题描述】:我正在使用带有代码优先方法的 EF 6。除了数据库级别的数据库约束检查之外,我还想在 POCO 级别提供唯一的约束检查。我关注了文章Setting unique Constraint with fluent API?,有人建议使用 [Index()] 属性。 我在我的 poco 类中应用了相同的方法,但看起来它仍在从数据库级别抛出异常。
这是我的代码:
[Key]
public decimal OrderId get; set;
[Index("ORDER_CC", 2, IsUnique = true)]
public decimal? MemberId get; set;
[Index("ORDER_CC", 3, IsUnique = true)]
public decimal? ItemId get; set;
[Index("ORDER_CC", 1, IsUnique = true)]
public decimal? OrderNumber get; set;
public decimal? Cost get; set;
public DateTime Time get; set;
我不确定我在这里做错了什么?
我也想问:
-
我是否需要保留与我在 Order 数据库表中的索引名称相同的索引名称?
我怎么知道,它正在根据 EF 约束检查或数据库约束检查进行验证?
与在数据库中的 Order 表中定义的顺序相比,我在 POCO 类上保持了相同的索引顺序。
这是我的数据库脚本:
CREATE UNIQUE INDEX xyz.ORDER_CC ON xyz.Order
(OrderNumber, MemberId, ItemId)
LOGGING
TABLESPACE USERS
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 128K
NEXT 1M
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
)
NOPARALLEL;
有什么想法吗?
【问题讨论】:
【参考方案1】:问题不在于 Index 属性,而在于您对其功能的期望。
Index 属性不验证唯一约束,它仅指示实体框架代码优先到 create an index in the database during a migration。从您的问题中可以清楚地看出,您首先使用 EF 代码,即 POCO 和编码映射,但您使用的是预先存在的数据库。在这种情况下,应用索引属性是没有用的。
这也回答了您在哪里检查约束的问题:在数据库中。这就是为什么它仍然会抛出错误。如果您想要代码中的唯一约束,则必须自己编写。
【讨论】:
感谢您的回复。是的,我们有现有的数据库。您说“如果您想要代码中的唯一约束,您必须自己编写它” - 我如何实现这一点?您的意思是在 POCO 课程中提供此检查吗?我只是 POCO 和 EF 的新手。谢谢 另外,我们希望在 POCO(我们没有)和数据库(我们在 DB 中有)中提供唯一的约束检查。谢谢 不一定在类(实体)本身,而是在存储实体的代码中。例如,当名称应该是唯一的时,您在保存更改之前检查它是否存在。不是很喜欢它。数据库约束是最后一个问题,以防大量并发在检查和保存之间挤压。【参考方案2】:更新
我已在 code project
上发布了相关信息一般来说,这取决于您放在类上的属性来生成唯一索引
感谢 Shimmy 的回答 https://***.com/a/15999805/105445
您可以自己通过创建自定义ValidationAttribute
来以通用方式验证属性。然后你可以这样使用它:
[ShouldBeUnique()]
public string SomeProperty get; set;
看看这个例子
http://blogs.microsoft.co.il/shimmy/2012/01/23/uniqueattribute-that-validates-a-unique-field-against-its-fellow-rows-in-the-database-inherits-dataannotationsvalidationattribute/
【讨论】:
以上是关于Entity Framework 6 Code First 方法 - 唯一约束不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework 6 Code First +MVC5+MySql/Oracle使用过程中的两个问题
Entity Framework 6 + Code First + Oracle 12c 的示例
Code First Entity Framework 6化被动为主动之explicit loading模式实战分析( 附源码)
如何使用 Entity Framework 6 Code First 设置默认值约束?