.net 实体框架更新数据库问题
几年来,我一直在使用实体框架代码优先的方法,我必须说,我对它的易维护性印象深刻——直到现在 在我的新项目中,每当我修改引用其他实体的实体时,我似乎都会遇到问题 当我在packetmanager控制台中运行updatedatabase-verbose函数时,我似乎遇到了相同的错误.net 实体框架更新数据库问题,.net,sql-server,entity-framework,.net,Sql Server,Entity Framework,几年来,我一直在使用实体框架代码优先的方法,我必须说,我对它的易维护性印象深刻——直到现在 在我的新项目中,每当我修改引用其他实体的实体时,我似乎都会遇到问题 当我在packetmanager控制台中运行updatedatabase-verbose函数时,我似乎遇到了相同的错误 Cannot find the object xxxx because it does not exist or you do not have permissions. 在我当前的例子中,我有一个Cars集合,我想向
Cannot find the object xxxx because it does not exist or you do not have permissions.
在我当前的例子中,我有一个Cars集合,我想向集合添加排序顺序,所以我添加了一个名为CarSortPair的新类,它接受一个Car对象,一个SortOrder整数,还有一个ID
我在Google和StackOverflow上搜索了很多,有不同的建议,其中很多建议运行添加迁移
当我运行addmigrationcarlist时,我将此代码放入自动生成的迁移类中
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,以查看这是否是实体框架中的错误,但结果相同。这与codeplex上描述的问题非常相似:
在6.1中,这个问题被标记为“已解决”,所以还有点等待奇怪,但我以前在迁移中遇到过一些奇怪的情况。为什么不能将迁移文件更改为正确的顺序?