幾年來,我一直在使用實體框架代碼優先的方法,我必須說,我留下了深刻的印象,它的種子維護有多容易 - 直到現在!實體框架更新 - 數據庫問題
在我的新項目中,我似乎遇到了問題,每當我修改一個引用其他實體的實體時。
當我在分組管理器控制檯中運行update-database -verbose功能時,我似乎得到了同樣的錯誤。
Cannot find the object xxxx because it does not exist or you do not have permissions.
在我目前的情況下,我有車的集合,我想排序順序添加到集合,所以我增加了一個名爲CarSortPair新的類,它需要一個Car對象,一個SortOrder的整數和其中也有一個ID。
我已經嘗試過在Google和StackOverflow上搜索很多,並且有不同的建議,其中許多建議運行添加遷移。
當我運行add-migration carlist時,我將這段代碼加入到自動生成的遷移類中。
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-beta2,以查看這是否是實體框架中的錯誤,但結果相同。
奇怪,但我已經遇到了一些怪事與之前的遷移。爲什麼你不能只是改變你的遷移文件的順序? – Thewads