【问题标题】:Entity Framework 6 Code First approach - unique constraint doesn't workEntity Framework 6 Code First 方法 - 唯一约束不起作用
【发布时间】: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; }

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

我也想问:

  1. 我是否需要保留与我在 Order 数据库表中的索引名称相同的索引名称?
  2. 我怎么知道,它正在根据 EF 约束检查或数据库约束检查进行验证?
  3. 与在数据库中的 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;

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    问题不在于 Index 属性,而在于您对其功能的期望。

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

    这也回答了您在哪里检查约束的问题:在数据库中。这就是为什么它仍然会抛出错误。如果您想要代码中的唯一约束,则必须自己编写。

    【讨论】:

    • 感谢您的回复。是的,我们有现有的数据库。您说“如果您想要代码中的唯一约束,您必须自己编写它” - 我如何实现这一点?您的意思是在 POCO 课程中提供此检查吗?我只是 POCO 和 EF 的新手。谢谢
    • 另外,我们希望在 POCO(我们没有)和数据库(我们在 DB 中有)中提供唯一的约束检查。谢谢
    • 不一定在类(实体)本身,而是在存储实体的代码中。例如,当名称应该是唯一的时,您在保存更改之前检查它是否存在。不是很喜欢它。数据库约束是最后一个问题,以防大量并发在检查和保存之间挤压。
    【解决方案2】:

    更新

    我已在 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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-06
      • 2011-11-13
      • 2013-12-06
      • 1970-01-01
      • 2019-04-19
      • 2013-11-02
      • 1970-01-01
      相关资源
      最近更新 更多