Как уже упоминалось в комментариях к ответу Мортезаса, есть метод CreateIndex / DropIndex, если вы используете миграции.
Но если вы находитесь в режиме «отладки» / разработки и все время меняете схему и каждый раз воссоздаете базу данных, вы можете использовать пример, упомянутый в ответе Мортезы.
Чтобы сделать это немного проще, я написал очень простой метод расширения, чтобы сделать его строго типизированным, в качестве вдохновения, которым я хочу поделиться со всеми, кто читает этот вопрос и, возможно, также хотел бы этот подход. Просто измените его в соответствии со своими потребностями и способом именования индексов.
You use it like this: context.Database.CreateUniqueIndex<User>(x => x.Name);
.
public static void CreateUniqueIndex<TModel>(this Database database, Expression<Func<TModel, object>> expression)
{
if (database == null)
throw new ArgumentNullException("database");
// Assumes singular table name matching the name of the Model type
var tableName = typeof(TModel).Name;
var columnName = GetLambdaExpressionName(expression.Body);
var indexName = string.Format("IX_{0}_{1}", tableName, columnName);
var createIndexSql = string.Format("CREATE UNIQUE INDEX {0} ON {1} ({2})", indexName, tableName, columnName);
database.ExecuteSqlCommand(createIndexSql);
}
public static string GetLambdaExpressionName(Expression expression)
{
MemberExpression memberExp = expression as MemberExpression;
if (memberExp == null)
{
// Check if it is an UnaryExpression and unwrap it
var unaryExp = expression as UnaryExpression;
if (unaryExp != null)
memberExp = unaryExp.Operand as MemberExpression;
}
if (memberExp == null)
throw new ArgumentException("Cannot get name from expression", "expression");
return memberExp.Member.Name;
}
Обновление: начиная с версии 6.1 и далее доступен атрибут [Index].
Подробнее см. http://msdn.microsoft.com/en-US/data/jj591583#Index