Уникальное ограничение с платформой Entity с использованием первых миграций кода
Я выполняю первые шаги миграции кода сущности (v 5) в приложении MVC 4. Я хотел бы добавить уникальное ограничение на уровне базы данных.
Я знаю, что это можно сделать при создании таблицы, но у меня уже есть таблица.
http://msdn.microsoft.com/en-US/data/jj591621
Я пробовал следующее, помеченное как ответ: Уникальное ограничение с EFCodeFirst и SqlCe4
Мой контекст базы данных немного отличается, я указываю, что имя подключения выглядит следующим образом
public AppDatabaseContext() : base("MyConnectionDBContext")
Когда я использую консоль управления пакетами для обновления базы данных, метод переопределенного семени не вызывается:
protected override void Seed(AppDatabaseContext context)
Я также пробовал следующее: http://romiller.com/2010/07/31/ef-ctp4-tips-tricks-running-additional-ddl/
Я не использовал вложенный класс, потому что казалось, что мне нужно зарегистрировать инициализатор через app.config. Я не мог заставить его работать, инициализируя его в коде. Вызывается InitializeDatabase, но следующее условие никогда не выполняется:
(!context.Database.Exists() || !context.Database.ModelMatchesDatabase())
Это происходит потому, что это происходит после выполнения миграции...
Я также пробовал это на одном этапе: Уникальное ограничение в первом коде Framework Entity. Это была та же проблема, что и раньше, это условие никогда не возвращалось.
В идеале я хотел бы включить некоторый стандартный SQL в мой файл миграции. Есть ли способ сделать это? Если нет, где я могу увидеть, как это сделать, используя первые миграции кода?
Спасибо!
UPDATE:
Есть ли причина, по которой я не могу использовать функцию SQL?
public override void Up()
{
AddColumn("Posts", "Abstract", c => c.String());
Sql("UPDATE Posts SET Abstract = LEFT(Content, 100) WHERE Abstract IS NULL");
}
Очевидно, используя правильный SQL...
Ответы
Ответ 1
С первыми миграциями кода я только что использовал это в методе Up()
, чтобы добавить уникальный индекс в один столбец:
CreateIndex(table: "Organisations",
column: "Name",
unique: true, // unique index
name: "MyIndex");
... и затем в методе Down()
:
DropIndex(table: "Organisations",
name: "MyIndex");
Это то, что вам нужно?
Ответ 2
Вы можете просто создать новую миграцию с помощью команды Add-Migration
из консоли диспетчера пакетов. После создания пустой миграции в методе Up
вы можете использовать метод CreateIndex
класса DbMigration
для создания нового индекса. Это будет выглядеть примерно так:
CreateIndex("dbo.Accounts", "AccessKey", unique: true);
Ответ 3
Так как EF 6.1 вы можете сделать это в своей модели с помощью
атрибут
[Index("IX_UniqueName", IsUnique = true)]
public string Name {get;set;}
или свободно
Property(s => s.Name).HasColumnAnnotation(IndexAnnotation.AnnotationName,
new IndexAnnotation(
new IndexAttribute("IX_UniqueName") { IsUnique = true }));
Свободный метод не идеален как его сумасшедшая многословная ИМО, но по крайней мере ее возможно сейчас.
Больше событий в блоге Артура Викерса http://blog.oneunicorn.com/2014/02/15/ef-6-1-creating-indexes-with-indexattribute/