首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >实体框架代码的第一个唯一列

实体框架代码的第一个唯一列
EN

Stack Overflow用户
提问于 2012-05-16 16:20:49
回答 3查看 132K关注 0票数 127

我使用的是Entity Framework4.3和Code Fist。

我有一节课

代码语言:javascript
复制
public class User
{
   public int UserId{get;set;}
   public string UserName{get;set;}
}

如何告诉实体框架在创建数据库表时UserName必须是唯一的?如果可能的话,我更喜欢使用数据模拟而不是配置文件。

EN

回答 3

Stack Overflow用户

发布于 2012-05-16 16:36:18

EF不支持除键以外的唯一列。如果您使用EF迁移,您可以强制EF在UserName列上创建唯一索引(在迁移代码中,而不是通过任何注释),但唯一性将仅在数据库中强制执行。如果您尝试保存重复的值,则必须捕获由数据库触发的异常(违反约束)。

票数 28
EN

Stack Overflow用户

发布于 2014-04-17 23:32:45

从您的代码中可以明显看出,您使用的是POCO。没有必要使用另一个键:您可以按照juFo的建议添加一个索引。

如果使用Fluent API而不是属性UserName属性,则列注释应如下所示:

代码语言:javascript
复制
this.Property(p => p.UserName)
    .HasColumnAnnotation("Index", new IndexAnnotation(new[] { 
        new IndexAttribute("Index") { IsUnique = true } 
    }
));

这将创建以下SQL脚本:

代码语言:javascript
复制
CREATE UNIQUE NONCLUSTERED INDEX [Index] ON [dbo].[Users]
(
    [UserName] ASC
)
WITH (
    PAD_INDEX = OFF, 
    STATISTICS_NORECOMPUTE = OFF, 
    SORT_IN_TEMPDB = OFF, 
    IGNORE_DUP_KEY = OFF, 
    DROP_EXISTING = OFF, 
    ONLINE = OFF, 
    ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]

如果您尝试插入具有相同UserName的多个用户,您将得到一个包含以下消息的DbUpdateException:

代码语言:javascript
复制
Cannot insert duplicate key row in object 'dbo.Users' with unique index 'Index'. 
The duplicate key value is (...).
The statement has been terminated.

同样,在6.1版之前的Entity Framework中,列注释不可用。

票数 10
EN

Stack Overflow用户

发布于 2014-03-10 03:58:16

请注意,在Entity Framework6.1(目前处于测试阶段)中,它将支持IndexAttribute来注释索引属性,这将在您的Code First迁移中自动生成一个(唯一的)索引。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10614575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档