Уникальное ограничение с платформой Entity с использованием первых миграций кода - программирование
Подтвердить что ты не робот

Уникальное ограничение с платформой 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...

4b9b3361

Ответ 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/