ASP.NET MVC5 - EF6忽略Required和StringLength

时间:2017-11-03 14:31:33

标签: asp.net asp.net-mvc entity-framework tsql entity-framework-6

我正在使用带有asp.net mvc 5和实体框架6的Visual Studio 2017.我正在关注一个在线课程和作者正在做的步骤,创建了2个带有属性的类,然后将属性标记为[Required]和将[StringLength(255)]赋给其他一些字符串属性。修改适用于一个类,但不适用于另一个类。

这是两个类的代码:

正在运作的那个:

 public class Genre
    {
        public byte Id { get; set; }

        [Required]
        [StringLength(255)]
        public string Name { get; set; }
    }

无效的

public class Gig
    {
        public int Id { get; set; }

        [Required]
        public ApplicationUser Artist { get; set; }

        public DateTime DateTime { get; set; }

        [Required]
        [StringLength(255)]
        public string Venue { get; set; }

        [Required]
        public Genre Genre { get; set; }
    }

我在添加属性之前第一次运行迁移,而CreateTables.cs迁移如下所示:

 public override void Up()
    {
        CreateTable(
            "dbo.Genres",
            c => new
                {
                    Id = c.Byte(nullable: false),
                    Name = c.String(),
                })
            .PrimaryKey(t => t.Id);

        CreateTable(
            "dbo.Gigs",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    DateTime = c.DateTime(nullable: false),
                    Venue = c.String(),
                    Artist_Id = c.String(maxLength: 128),
                    Genre_Id = c.Byte(),
                })
            .PrimaryKey(t => t.Id)
            .ForeignKey("dbo.AspNetUsers", t => t.Artist_Id)
            .ForeignKey("dbo.Genres", t => t.Genre_Id)
            .Index(t => t.Artist_Id)
            .Index(t => t.Genre_Id);

    }

然后我将属性添加到我的代码中,并添加了一个新的迁移,当我运行add migration时,迁移中生成的代码如下所示:

  public override void Up()
        {
            DropForeignKey("dbo.Gigs", "Artist_Id", "dbo.AspNetUsers");
            DropForeignKey("dbo.Gigs", "Genre_Id", "dbo.Genres");
            DropIndex("dbo.Gigs", new[] { "Artist_Id" });
            DropIndex("dbo.Gigs", new[] { "Genre_Id" });
            AlterColumn("dbo.Genres", "Name", c => c.String(nullable: false, maxLength: 255));
            AlterColumn("dbo.Gigs", "Venue", c => c.String(nullable: false, maxLength: 255));
            AlterColumn("dbo.Gigs", "Artist_Id", c => c.String(nullable: false, maxLength: 128));
            AlterColumn("dbo.Gigs", "Genre_Id", c => c.Byte(nullable: false));
            CreateIndex("dbo.Gigs", "Artist_Id");
            CreateIndex("dbo.Gigs", "Genre_Id");
            AddForeignKey("dbo.Gigs", "Artist_Id", "dbo.AspNetUsers", "Id", cascadeDelete: true);
            AddForeignKey("dbo.Gigs", "Genre_Id", "dbo.Genres", "Id", cascadeDelete: true);
        }

但是,生成表的生成的T-SQL代码如下:

CREATE TABLE [dbo].[Gigs] (
[Id]        INT            IDENTITY (1, 1) NOT NULL,
[DateTime]  DATETIME       NOT NULL,
[Venue]     NVARCHAR (MAX) NULL,
[Artist_Id] NVARCHAR (128) NULL,
[Genre_Id]  TINYINT        NULL,
CONSTRAINT [PK_dbo.Gigs] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_dbo.Gigs_dbo.AspNetUsers_Artist_Id] FOREIGN KEY ([Artist_Id]) REFERENCES [dbo].[AspNetUsers] ([Id]),


   CONSTRAINT [FK_dbo.Gigs_dbo.Genres_Genre_Id] FOREIGN KEY ([Genre_Id]) REFERENCES [dbo].[Genres] ([Id])
);

但是,为另一个表生成的TSQL是正确的:

   CREATE TABLE [dbo].[Genres] (
    [Id]   TINYINT        NOT NULL,
    [Name] NVARCHAR (255) NOT NULL,
    CONSTRAINT [PK_dbo.Genres] PRIMARY KEY CLUSTERED ([Id] ASC)
);

为什么T-SQL没有反映第一个表的迁移修改?知道我添加了迁移并执行了update-database,并且可以看到一个表(类型)的更改,而不是另一个表的更改。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,int i;StringLength数据注释都没有给我带来太多帮助。我似乎正在尝试使用相同的在线课程,最初是针对MSVS2015,但我使用的是最新的MSVS2017。

到目前为止我已尝试过:

  • 按原样设置长度,仅在迁移中更改
  • 使用MaxLength
  • 设置特定迁移版本
  • 使用Update-Database -TargetMigration Migration
  • 从头开始设置所有迁移
  • 重新创建数据库(在SQL Server对象资源管理器中删除数据库)

毕竟SQL定义仍然包含初始MAX约束,以及表定义。

迁移的一部分

Update-Database -TargetMigration 0 | Update-Database -Force

所有迁移后的数据库定义

AlterColumn("dbo.Genres", "Name", c => c.String(nullable: false, maxLength: 255));
AlterColumn("dbo.Gigs", "Venue", c => c.String(nullable: false, maxLength: 255));
AlterColumn("dbo.Gigs", "Artist_Id", c => c.String(nullable: false, maxLength: 128));