如何更改SQL Server中列的数据类型?

时间:2014-10-23 13:21:07

标签: sql-server entity-framework entity-framework-6 database-migration

我使用的是SQL Server 2008 R2。

我想将列的数据类型(Size)从decimal更改为int。首先,我使用了SQL Server的设计者,但SQL Server不允许我这样做。请注意图片。

然后我决定写一个脚本。但是我收到了一个错误。

  1. 如何使用SQL脚本执行此操作?

  2. 如何通过db-migration执行此操作?

    我使用了Entity Framework 6.x,C#和代码优先的方法来创建数据库。我想在Tag表中保存我的数据。

  3. 有没有比db-migration更好的工具?我觉得很无聊!

  4. 我的模特:

    namespace Jahan.Blog.Model
    {
       public class Tag : Entity, ITag
       {
        [Range(1, 4)]
        public virtual int Size { get; set; } //In db data type of Size is decimal.I want to change it to int.
    
        [Required]
        [StringLength(25)]
        public virtual string Title { get; set; }
    
        [StringLength(256)]
        public virtual string Description { get; set; }
    
        public virtual bool IsActive { get; set; }
    
        public virtual ISet<ArticleTag> ArticleTags { get; set; }       // FK
    
        public virtual ISet<ProjectTag> ProjectTags { get; set; }       // FK
       }
    }
    

    enter image description here

    SQL脚本:

    USE [Jahan-Blog]
    GO
    
    /****** Object:  Table [dbo].[Tag]    Script Date: 10/23/2014 16:17:09 ******/
    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Tag]') AND type in (N'U'))
    DROP TABLE [dbo].[Tag]
    GO
    
    USE [Jahan-Blog]
    GO
    
    /****** Object:  Table [dbo].[Tag]    Script Date: 10/23/2014 16:17:09 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[Tag](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [Title] [nvarchar](25) NOT NULL,
        [Description] [nvarchar](256) NULL,
        [IsActive] [bit] NOT NULL,
        [Size] [int] NOT NULL,
        [CreatedDate] [datetime] NULL,
        [ModifiedDate] [datetime] NULL,
     CONSTRAINT [PK_dbo.Tag] 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
    

    运行脚本后出现此错误。

      

    Msg 3726,Level 16,State 1,Line 4
      无法丢弃对象&#39; dbo.Tag&#39;   因为它是由FOREIGN KEY约束引用的。

         

    Msg 2714,Level 16,State 6,Line 2
      已有一个名为&#39; Tag&#39;在里面   数据库中。

    DbMigrations配置:

    namespace Jahan.Blog.Web.Mvc.Migrations
    {
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;
    
    //For knowing more information about db-migration please visit http://msdn.microsoft.com/en-gb/data/jj591621
    internal sealed class Configuration 
        : DbMigrationsConfiguration<Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
            AutomaticMigrationDataLossAllowed = false;
        }
    
        protected override void Seed(Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext context)
        {
        }
       }
    }
    

2 个答案:

答案 0 :(得分:3)

要使用SQL更改类型,请运行以下

Alter table dbo.[Tag] alter column [Size] int NOT NULL

要通过EF迁移使用

更改类型
AlterColumn("dbo.Tag", "Size", c => c.Int(nullable: false)); 

答案 1 :(得分:1)

为了能够在SQL Server设计器中进行更改,请在“工具”菜单上单击“选项”,展开 设计人员,然后单击表和数据库设计器。 清除“阻止保存需要该表的更改” 重新创建复选框。