实体框架6代码优先方法 - 唯一约束不起作用

时间:2015-04-02 20:08:03

标签: database entity-framework validation entity-framework-6

我使用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; }

我不确定我在这里做错了什么?

我还想问下列内容:

  1. 我是否需要保留与订单数据库表中的索引名称相同的索引名称?
  2. 我怎么知道,它正在验证EF约束检查或数据库约束检查?
  3. 我对POCO类的索引保持了相同的顺序,与数据库中的Order表中定义的顺序相比。
  4. 这是我的数据库脚本:

    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;
    

    有什么想法吗?

2 个答案:

答案 0 :(得分:2)

问题不在于索引属性,而在于您对它的作用的期望。

“索引”属性未验证唯一约束,它仅指示实体框架代码优先于create an index in the database during a migration。从您的问题可以清楚地看出,您首先使用EF代码,即POCO和编码映射,但您使用的是预先存在的数据库。在这种情况下,应用索引属性是没用的。

这样也可以在数据库中回答检查约束的问题。这就是为什么它仍然会抛出错误的原因。如果您想在代码中使用唯一约束,则必须自己编写。

答案 1 :(得分:0)

<强> 更新

我已在code project

发布了相关信息

通常,它取决于您在类上生成唯一索引的属性

感谢Shimmy的回答 https://stackoverflow.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/