【发布时间】: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