我正在使用带有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,并且可以看到一个表(类型)的更改,而不是另一个表的更改。
感谢任何帮助。
答案 0 :(得分:0)
我遇到了同样的问题,int i;
和StringLength
数据注释都没有给我带来太多帮助。我似乎正在尝试使用相同的在线课程,最初是针对MSVS2015,但我使用的是最新的MSVS2017。
到目前为止我已尝试过:
MaxLength
Update-Database -TargetMigration Migration
毕竟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));