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

ASP.NET 5 EF7代码优先迁移默认情况下按字母顺序创建列

很难确保可预测的顺序,因此目前没有实现按属性顺序排序。查看此处的讨论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

相关文章: