首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以迁移到实体框架中没有迁移的数据库吗?

我可以迁移到实体框架中没有迁移的数据库吗?
EN

Stack Overflow用户
提问于 2017-03-16 06:52:55
回答 4查看 3.3K关注 0票数 5

我创建了一个桌面应用程序,它使用了SQLCE4.0Entity frameworkCode 模式。所以,最初我在一个系统上安装了应用程序,它运行得很好。

现在,我向模型类添加了很少的属性,因此为此目的,我启用了使用Enable-Migrations的迁移,并使用Add-Migration "MyMigration"添加了新的迁移。这也是成功的,我能够安装新版本和升级数据库,没有任何问题。

但是现在当我在没有现有数据库的系统上安装这个设置时,它就失败了,所以在研究之后我意识到我需要添加初始迁移,所以我撤销了模型中的更改,还删除了SQLCE数据库文件,添加了初始迁移,然后添加了Update-Database。因此,如果我尝试使用旧数据库更新数据库,而旧数据库是在不启用迁移的情况下创建的,那么它就失败了,它试图将初始迁移应用到数据库,而我认为这是不应该的。

现在,如果删除旧数据库文件,然后更新-数据库,则会创建新的db,然后再一次将更改添加到模型中,并添加预期迁移。

因此,在此之后,我可以在空白系统上安装我的应用程序,但是它在一个旧数据库系统上失败,即它不升级数据库。

它也尝试应用初始迁移,即再次创建所有的表,但是失败地说,表已经存在,这是不需要的。

EN

回答 4

Stack Overflow用户

发布于 2017-03-22 17:54:12

问题是,它检查了一个名为Migrations的表,在那里我认为它可以获得当前文件和更改的信息。如果你在不使用EF的情况下对数据库做了大量的修改,那么你就会遇到很多的克隆。

您可以使用流利迁移自己完成一切,并对更改和回滚有更多的控制。

示例:

代码语言:javascript
复制
 [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");
    }
}
票数 3
EN

Stack Overflow用户

发布于 2017-03-16 07:01:25

你需要的是

代码语言:javascript
复制
update-database 

这将相应地更新数据库。只要记住每次添加迁移时都需要更新数据库,当您在其他地方安装系统时,只需要做一个更新-数据库,以使旧的数据库与实体框架相媲美。

票数 1
EN

Stack Overflow用户

发布于 2017-03-18 13:56:15

您需要检查是否进入初始脚本,是否已经存在表。这不是EF问题,即使您试图运行带有表定义的create脚本而不检查现有的脚本,它也会失败。

例如,

我没有在我的机器上安装任何数据库,而且我有一个脚本,可以用某个表创建新的数据库。

这是创建表的脚本

代码语言:javascript
复制
    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

请注意,我只是在创建没有检查对象是否存在的表,现在如果我在带有空白数据库的新机器上运行该表,它将毫无错误地运行。

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

因此,在创建表之前,您需要检查对象是否存在,如以下脚本中所示.

代码语言:javascript
复制
    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

因此,当您尝试运行它时,它将跳过表中已有的对象将继续到您的更新脚本.

希望这能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42827146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档