我创建了一个桌面应用程序,它使用了SQLCE4.0和Entity framework的Code 模式。所以,最初我在一个系统上安装了应用程序,它运行得很好。
现在,我向模型类添加了很少的属性,因此为此目的,我启用了使用Enable-Migrations的迁移,并使用Add-Migration "MyMigration"添加了新的迁移。这也是成功的,我能够安装新版本和升级数据库,没有任何问题。
但是现在当我在没有现有数据库的系统上安装这个设置时,它就失败了,所以在研究之后我意识到我需要添加初始迁移,所以我撤销了模型中的更改,还删除了SQLCE数据库文件,添加了初始迁移,然后添加了Update-Database。因此,如果我尝试使用旧数据库更新数据库,而旧数据库是在不启用迁移的情况下创建的,那么它就失败了,它试图将初始迁移应用到数据库,而我认为这是不应该的。
现在,如果删除旧数据库文件,然后更新-数据库,则会创建新的db,然后再一次将更改添加到模型中,并添加预期迁移。
因此,在此之后,我可以在空白系统上安装我的应用程序,但是它在一个旧数据库系统上失败,即它不升级数据库。
它也尝试应用初始迁移,即再次创建所有的表,但是失败地说,表已经存在,这是不需要的。
发布于 2017-03-22 17:54:12
问题是,它检查了一个名为Migrations的表,在那里我认为它可以获得当前文件和更改的信息。如果你在不使用EF的情况下对数据库做了大量的修改,那么你就会遇到很多的克隆。
您可以使用流利迁移自己完成一切,并对更改和回滚有更多的控制。
示例:
[Migration(201610250659)]
public class _201610250659_AddedMinimumValue_Prices : Migration
{
public override void Up()
{
Alter.Table("Prices")
.AddColumn("MinimunValue").AsInt32().NotNullable().WithDefaultValue(1);
}
public override void Down()
{
Delete.Column("MinimunValue")
.FromTable("Prices");
}
}发布于 2017-03-16 07:01:25
你需要的是
update-database 这将相应地更新数据库。只要记住每次添加迁移时都需要更新数据库,当您在其他地方安装系统时,只需要做一个更新-数据库,以使旧的数据库与实体框架相媲美。
发布于 2017-03-18 13:56:15
您需要检查是否进入初始脚本,是否已经存在表。这不是EF问题,即使您试图运行带有表定义的create脚本而不检查现有的脚本,它也会失败。
例如,
我没有在我的机器上安装任何数据库,而且我有一个脚本,可以用某个表创建新的数据库。
这是创建表的脚本
USE [TestStudent]
GO
/****** Object: Table [dbo].[EmployeeInformation] Script Date: 18-03-2017 19:12:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[EmployeeInformation](
[Id] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[LastName] [nvarchar](50) NULL,
[Designation] [nvarchar](50) NULL,
CONSTRAINT [PK_EmployeeInformation] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[sample] Script Date: 18-03-2017 19:12:41 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[sample](
[Id] [int] IDENTITY(1,1) NOT NULL,
[TableId] [int] NULL,
CONSTRAINT [PK_sample] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO请注意,我只是在创建没有检查对象是否存在的表,现在如果我在带有空白数据库的新机器上运行该表,它将毫无错误地运行。

现在,我尝试在现有数据库上运行相同的脚本,现有的对象可能用于更新某些表,比如在您的例子中,但是这里的诀窍是,您的更新脚本将位于下面.因此,它将首先尝试创建表,如果存在,则会抛出错误。

因此,在创建表之前,您需要检查对象是否存在,如以下脚本中所示.
USE [TestStudent]
GO
/****** Object: Table [dbo].[EmployeeInformation] Script Date: 18-03-2017 19:22:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[EmployeeInformation]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[EmployeeInformation](
[Id] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[LastName] [nvarchar](50) NULL,
[Designation] [nvarchar](50) NULL,
CONSTRAINT [PK_EmployeeInformation] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
/****** Object: Table [dbo].[sample] Script Date: 18-03-2017 19:22:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sample]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[sample](
[Id] [int] IDENTITY(1,1) NOT NULL,
[TableId] [int] NULL,
CONSTRAINT [PK_sample] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO因此,当您尝试运行它时,它将跳过表中已有的对象将继续到您的更新脚本.

希望这能帮上忙。
https://stackoverflow.com/questions/42827146
复制相似问题