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 设置默认值约束?

Entity Framework 6 Code First 方法 - 唯一约束不起作用

Entity Framework 6 Code first:如何使用“循环”关系和存储生成的列来播种数据?