Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 实体框架更新数据库问题_.net_Sql Server_Entity Framework - Fatal编程技术网

.net 实体框架更新数据库问题

.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集合,我想向

几年来,我一直在使用实体框架代码优先的方法,我必须说,我对它的易维护性印象深刻——直到现在

在我的新项目中,每当我修改引用其他实体的实体时,我似乎都会遇到问题

当我在packetmanager控制台中运行updatedatabase-verbose函数时,我似乎遇到了相同的错误

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中,这个问题被标记为“已解决”,所以还有点等待

奇怪,但我以前在迁移中遇到过一些奇怪的情况。为什么不能将迁移文件更改为正确的顺序?