【问题标题】:Required and StringLength are ignored by ASP.NET MVC5 - EF6ASP.NET MVC5 - EF6 忽略 required 和 StringLength
【发布时间】:2017-11-03 14:31:32
【问题描述】:

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

这是 2 个类的代码:

有效的:

 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);

    }

然后我将属性添加到我的代码中,并添加了一个新的迁移,当我运行添加迁移时,迁移中生成的代码是这样的:

  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 没有反映第一个表的迁移修改?知道我添加了迁移并执行了更新数据库,并且可以看到一个表(类型)的更改,但看不到另一个。

感谢任何帮助。

【问题讨论】:

  • 该 SQL 将创建表,迁移将运行 ALTER TABLE... 语句以进行您稍后添加的更改。
  • @DavidG 那么为什么它更新了一个表而不是另一个?如何更新我的表格?
  • 您实际应用迁移了吗?
  • 我做到了,正如我在问题中所说的那样。我运行了 add-migration 迁移名称,然后运行了更新数据库
  • 是的,所以 SQL 来自第一次迁移,另一个迁移应该运行一些不同的 SQL 来进行更改。

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


【解决方案1】:

我也遇到过同样的问题,StringLengthMaxLength 数据注释对我没有多大帮助。看来我正在尝试使用最初用于 MSVS2015 的相同在线课程,但我使用的是最新的 MSVS2017。

到目前为止我已经尝试过:

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

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

部分迁移

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));

所有迁移后的数据库定义

[Name] NVARCHAR (MAX) NULL,
...
[Venue]     NVARCHAR (MAX) NULL,
[Artist_Id] NVARCHAR (128) NULL,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-21
    • 2020-07-28
    • 1970-01-01
    • 2012-01-07
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多