Я использую Entity Framework Code Первый подход в течение нескольких лет, и я должен сказать, что меня впечатлило то, насколько легко его семя поддерживать - до сих пор!Проблемы с базой обновлений Entity Framework
В моем новом проекте я, кажется, сталкиваюсь с проблемами, каждый раз, когда я изменяю Entity, который ссылается на другие сущности.
Когда я запускаю функцию update-database -verbose в консоли Packet-Manager, я, похоже, получаю ту же ошибку.
Cannot find the object xxxx because it does not exist or you do not have permissions.
В моем нынешнем случае, у меня есть коллекция автомобилей, и я хотел бы добавить порядок сортировки коллекции, поэтому я добавил новый класс CarSortPair, который принимает объект автомобиля, SortOrder целого, и который также имеет идентификатор.
Я пробовал много искать в Google и StackOverflow, и есть разные предложения, и многие из них предлагают запустить add-migration.
Когда я запускаю каталог для добавления миграции, я получаю этот код в автоматически сгенерированный класс миграции.
public partial class carlist : DbMigration
{
public override void Up()
{
RenameTable(name: "dbo.CarListCars", newName: "CarListCarSortPairs");
DropForeignKey("dbo.CarListCars", "Car_ID", "dbo.Cars");
DropIndex("dbo.CarListCars", new[] { "Car_ID" });
CreateTable(
"dbo.CarSortPairs",
c => new
{
ID = c.Int(nullable: false, identity: true),
SortOrder = c.Int(nullable: false),
Car_ID = c.Int(),
})
.PrimaryKey(t => t.ID)
.ForeignKey("dbo.Cars", t => t.Car_ID)
.Index(t => t.Car_ID);
CreateIndex("dbo.CarListCarSortPairs", "CarSortPair_ID");
AddForeignKey("dbo.CarListCarSortPairs", "CarSortPair_ID", "dbo.CarSortPairs", "ID", cascadeDelete: true);
}
public override void Down()
{
DropForeignKey("dbo.CarListCarSortPairs", "CarSortPair_ID", "dbo.CarSortPairs");
DropForeignKey("dbo.CarSortPairs", "Car_ID", "dbo.Cars");
DropIndex("dbo.CarListCarSortPairs", new[] { "CarSortPair_ID" });
DropIndex("dbo.CarSortPairs", new[] { "Car_ID" });
DropTable("dbo.CarSortPairs");
CreateIndex("dbo.CarListCars", "Car_ID");
AddForeignKey("dbo.CarListCars", "Car_ID", "dbo.Cars", "ID", cascadeDelete: true);
RenameTable(name: "dbo.CarListCarSortPairs", newName: "CarListCars");
}
}
Который сначала не кажется странным для меня, но когда я исследовал его ближе, я заметил, что порядок сценария не прав !?
Я попытался запустить обновление-базы данных -verbose -script, который создан этот скрипт:
EXECUTE sp_rename @objname = N'dbo.CarListCars', @newname = N'CarListCarSortPairs', @objtype = N'OBJECT'
IF object_id(N'[dbo].[FK_dbo.CarListCars_dbo.Cars_Car_ID]', N'F') IS NOT NULL
ALTER TABLE [dbo].[CarListCars] DROP CONSTRAINT [FK_dbo.CarListCars_dbo.Cars_Car_ID]
IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_Car_ID' AND object_id = object_id(N'[dbo].[CarListCars]', N'U'))
DROP INDEX [IX_Car_ID] ON [dbo].[CarListCars]
CREATE TABLE [dbo].[CarSortPairs] (
[ID] [int] NOT NULL IDENTITY,
[SortOrder] [int] NOT NULL,
[Car_ID] [int],
CONSTRAINT [PK_dbo.CarSortPairs] PRIMARY KEY ([ID])
)
CREATE INDEX [IX_Car_ID] ON [dbo].[CarSortPairs]([Car_ID])
CREATE INDEX [IX_CarSortPair_ID] ON [dbo].[CarListCarSortPairs]([CarSortPair_ID])
ALTER TABLE [dbo].[CarListCarSortPairs] ADD CONSTRAINT [FK_dbo.CarListCarSortPairs_dbo.CarSortPairs_CarSortPair_ID] FOREIGN KEY ([CarSortPair_ID]) REFERENCES [dbo].[CarSortPairs] ([ID]) ON DELETE CASCADE
ALTER TABLE [dbo].[CarSortPairs] ADD CONSTRAINT [FK_dbo.CarSortPairs_dbo.Cars_Car_ID] FOREIGN KEY ([Car_ID]) REFERENCES [dbo].[Cars] ([ID])
INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])
VALUES (N'201312100911087_AutomaticMigration', ......
Затем я попытался выполнить сценарий SQL, строка за строкой, и это на самом деле выполняется в неправильном порядке!
Как я могу исправить это, так что я могу легко поддерживать свой код. Это не имеет смысла, если мне нужно поддерживать скрипты вручную.
Редактировать: Я попытался обновить до EF 6.0.1 и новейшего 6.0.2-бета2, чтобы убедиться, что это была ошибка в Entity Framework, но тот же результат.
странно, но я наткнулся на какой-то странности с миграции раньше. Почему вы не можете просто изменить свой файл миграции в правильном порядке? – Thewads