我几年来一直在使用Entity Framework Code First方法,我必须说,到目前为止,我对它的种子维护非常容易感到印象深刻!
在我的新项目中,每当我改变一个引用其他实体的实体时,我似乎都会遇到问题。
当我在Packet-Manager控制台中运行update-database -verbose函数时,我似乎得到了同样的错误。
Cannot find the object xxxx because it does not exist or you do not have permissions.
在我目前的情况下,我有一个Cars集合,我想在集合中添加排序顺序,所以我添加了一个名为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");
}
}
起初对我来说并不奇怪,但是当我仔细研究它时,我注意到,脚本的顺序不正确!?
我尝试运行update-database -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,看看这是否是实体框架中的错误,但结果相同。
答案 0 :(得分:0)
这看起来非常像codeplex上描述的这个问题:Error in migration changing relation to "Many to Many"
该问题被标记为“已解决” - 在6.1中 - 所以有点等待