ASP.NET 5 EF7代码优先迁移默认情况下按字母顺序创建列
本文关键字:情况下 顺序 创建 默认 迁移 NET EF7 代码 ASP | 更新日期: 2023-09-27 18:29:38
我在本地机器上遇到了EF7代码优先迁移和SQL Server的一些奇怪问题。当我在命令提示符下运行以下命令时:
dnx ef migrations add InitialDatabse
它按字母顺序创建列。据我所知,默认情况通常是按照类中的相同顺序创建列。
这是我关心的问题:
为什么要按字母顺序创建我的列?
以下是我的模型和Dbcontext:
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime CreatedDate { get; set; } = DateTime.Now;
public string CreatedBy { get; set; }
public DateTime? ModifiedDate { get; set; }
public string ModifiedBy { get; set; }
// Navigation properties
public ICollection<Contact> Contacts { get; set; }
}
public class Contact
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Title { get; set; }
public string Email { get; set; }
public DateTime CreatedDate { get; set; } = DateTime.Now;
public string CreatedBy { get; set; }
public DateTime? ModifiedDate { get; set; }
public string ModifiedBy { get; set; }
}
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext ()
{
Database.EnsureCreated();
}
public DbSet<Customer> Customers { get; set; }
public DbSet<Contact> Contacts { get; set; }
}
这是我在向项目添加迁移后的InitialDatabase.cs文件:
migrationBuilder.CreateTable(
name: "Customer",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
CreatedBy = table.Column<string>(nullable: true),
CreatedDate = table.Column<DateTime>(nullable: false),
ModifiedBy = table.Column<string>(nullable: true),
ModifiedDate = table.Column<DateTime>(nullable: true),
Name = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Customer", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Contact",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
CreatedBy = table.Column<string>(nullable: true),
CreatedDate = table.Column<DateTime>(nullable: false),
CustomerId = table.Column<int>(nullable: true),
Email = table.Column<string>(nullable: true),
FirstName = table.Column<string>(nullable: true),
LastName = table.Column<string>(nullable: true),
ModifiedBy = table.Column<string>(nullable: true),
ModifiedDate = table.Column<DateTime>(nullable: true),
Title = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Contact", x => x.Id);
table.ForeignKey(
name: "FK_Contact_Customer_CustomerId",
column: x => x.CustomerId,
principalTable: "Customer",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
很难确保可预测的顺序,因此目前没有实现按属性顺序排序。查看此处的讨论https://github.com/aspnet/EntityFramework/issues/2272
因为.NET Core针对的是非Windows平台,所以自动化过程不能保证模型的属性按编码顺序提供给引擎。当我第一次发现这个问题时,我记得它与反思有关,但与细节无关。
无论如何,要解决这个问题,请使用数据注释强制执行列顺序。请注意,您使用的实际数字不需要以1为间隔,您可以使用10、20、30等值,因此,如果您需要移动/添加列,则可以使用15等值,而无需重新调整模型中的每个属性。
我还没有成功创建一个改变列顺序的迁移;我只是从头开始放下/重建我的表。
修改您的示例:
public class Customer
{
[Column(Order = 10)]
public int Id { get; set; }
[Column(Order = 20)]
public string Name { get; set; }
[Column(Order = 30)]
public DateTime CreatedDate { get; set; } = DateTime.Now;
[Column(Order = 40)]
public string CreatedBy { get; set; }
[Column(Order = 50)]
public DateTime? ModifiedDate { get; set; }
[Column(Order = 60)]
public string ModifiedBy { get; set; }
// Navigation properties
public ICollection<Contact> Contacts { get; set; }
}
有关代码中数据注释的更多信息,请查看此处的官方.NET核心文档:
https://msdn.microsoft.com/en-us/library/jj591583(v=vs.113).aspx