2013-12-10 45 views
1

几年来,我一直在使用实体框架代码优先的方法,我必须说,我留下了深刻的印象,它的种子维护有多容易 - 直到现在!实体框架更新 - 数据库问题

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

当我在分组管理器控制台中运行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,以查看这是否是实体框架中的错误,但结果相同。

+0

奇怪,但我已经遇到了一些怪事与之前的迁移。为什么你不能只是改变你的迁移文件的顺序? – Thewads

回答