19

想知道 Entity Framework 5 是否支持实体属性的唯一约束?如果是这样,我如何指定属性应该是唯一的?

4

5 回答 5

33

不,它没有。过去曾计划在 EF 5.0 中包含一个独特的约束功能:

http://blogs.msdn.com/b/efdesign/archive/2011/03/09/unique-constraints-in-the-entity-framework.aspx

但是您可以看到帖子顶部有更新:

更新:此功能已被推迟,不会包含在 Entity Framework 5 中。

您可以对该功能进行投票,以提高其实现的优先级......

http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1050579-unique-constraint-ie-candidate-key-support

...因为显然它目前甚至不在 EF 6.0 的路线图上:

http://entityframework.codeplex.com/wikipage?title=路线图

于 2012-08-05T20:26:25.180 回答
4

虽然 EF(撰写本文时为 6.0 版)仍然不支持开箱即用的唯一约束,但 Code First 方法有一些变通方法来获得所需的行为。请参阅基于属性的解决方案,作为类似问题的答案。适用于 EF 5.0+。

编辑:

从 EF 6.1 开始支持唯一索引

[Index(IsUnique = true)]
public string EmailAddress { get; set; }

对于大多数实际用途,它们与唯一约束相同。

于 2014-04-01T16:26:56.550 回答
4

好吧,我一直在寻找解决方案,最后我找到了。当您在代码中生成迁移时,您可以创建唯一键

 CreateTable(
                "dbo.TaBLE",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Date = c.DateTime(nullable: false),
                        Meter_Id = c.Int(),
                    })
                .PrimaryKey(t => t.Id)

                .Index(t => new {t.Meter_Id, t.Date}, true);

插入之前的验证您可以在 BLL 级别上进行,所以我认为它可以解决您的问题。

于 2013-09-13T11:25:53.553 回答
2

如上所述,它不受支持,但就目前而言,当我以编程方式创建数据库时(代码优先),我在 init db 部分使用以下代码:

MainDBContext mainDBContext = new MainDBContext();

mainDBContext.Database.ExecuteSqlCommand("ALTER TABLE table_name ADD CONSTRAINT uc_FieldName UNIQUE(FieldName)");

mainDBContext.Dispose();
于 2014-02-17T16:52:47.173 回答
0

我找到了一种解决方法,以实现对实体属性的唯一约束。它真的很直观。请参考我的另一篇文章:

https://stackoverflow.com/a/16496291/1873113

于 2013-05-11T10:53:27.130 回答