我使用的是Entity Framework4.3和Code Fist。
我有一节课
public class User
{
public int UserId{get;set;}
public string UserName{get;set;}
}
如何告诉实体框架在创建数据库表时UserName必须是唯一的?如果可能的话,我更喜欢使用数据模拟而不是配置文件。
发布于 2012-05-16 16:36:18
EF不支持除键以外的唯一列。如果您使用EF迁移,您可以强制EF在UserName
列上创建唯一索引(在迁移代码中,而不是通过任何注释),但唯一性将仅在数据库中强制执行。如果您尝试保存重复的值,则必须捕获由数据库触发的异常(违反约束)。
发布于 2014-04-17 23:32:45
从您的代码中可以明显看出,您使用的是POCO。没有必要使用另一个键:您可以按照juFo的建议添加一个索引。
如果使用Fluent API而不是属性UserName属性,则列注释应如下所示:
this.Property(p => p.UserName)
.HasColumnAnnotation("Index", new IndexAnnotation(new[] {
new IndexAttribute("Index") { IsUnique = true }
}
));
这将创建以下SQL脚本:
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:
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中,列注释不可用。
发布于 2014-03-10 03:58:16
请注意,在Entity Framework6.1(目前处于测试阶段)中,它将支持IndexAttribute来注释索引属性,这将在您的Code First迁移中自动生成一个(唯一的)索引。
https://stackoverflow.com/questions/10614575
复制相似问题