EntityFramework 代码优先:设置字段顺序
Posted
技术标签:
【中文标题】EntityFramework 代码优先:设置字段顺序【英文标题】:EntityFramework code first: Set order of fields 【发布时间】:2017-05-07 03:01:07 【问题描述】:我正在使用带有“代码优先”方法的 EntityFramework 进行迁移。
我已经成功地从我的模型中生成了表格,但是这些列是按字母顺序添加的,而不是我模型中的顺序。
我试过这个:
[Key, Column(Order=0)]
public int MyFirstKeyProperty get; set;
[Column(Order=1)]
public int MySecondKeyProperty get; set;
但这似乎不起作用。
如何手动设置数据库中字段的顺序?
我正在使用 ASP.NET Core 和 EF Core (SqlServer) v1.1.0。
【问题讨论】:
它本应在 EF Core 2.1.0 中得到修复,但它已被淘汰出发行版,并且仍处于打开状态并处于待办事项中......真是太糟糕了。 github.com/aspnet/EntityFrameworkCore/issues/11314 @Jess 明确一点,这是一个不同的问题。根据属性顺序对列进行排序不是 OP 所要求的。这实际上是在 v2.1 中发布的(尽管在您引用的那个问题中提到了警告);请参阅问题 #2272。 OP 询问的是使用 ColumnAttribute 的 Order 属性,不幸的是,它仍然不会在 v3.0 中发布。这两个问题很容易混淆;不过,这对您发布的内容仍然有用! EF Core 5.0.6 - 试过了,但列排序仍然不起作用(代码优先)。 【参考方案1】:目前未实现按类属性对列进行排序。 这是关于列排序的长时间讨论。 Column ordering #2272
Update as of 07/12/2017
此问题在积压里程碑中。这意味着它不是 将在 2.0 版本中发生。我们将重新评估积压 在 2.0 发布之后考虑这个项目。
Update as of 06/10/2019
EF Core v2.1 附带问题 2272,并将生成表中的列顺序与类中属性的顺序相匹配。但是,正如@lloyd-conrade 所提到的,这仅对初始创建有用
创建了一个新问题 #10059,以跟踪尊重 Column 属性的 Order 属性的可能实现。
如果 #2272 的实现对您来说不够,请指定一些内容 喜欢 [Column(Order = 1)] 会有所帮助,请为此问题投票并添加详细信息 关于您的方案(如果尚未列出)如下。
请注意,“Punted for 3.0”标签是在 2019 年 5 月 10 日添加的,也就是说它不会在 EF Core 3.0 中发布。
【讨论】:
非常令人失望,尤其是 在任何当前预定的版本中都没有计划改变这一点。您不喜欢列顺序的正确做法是编辑生成的迁移文件并根据需要移动顺序。 +1 为答案。 谢谢大家!手动编辑CreateTable
调用就可以了。遗憾的是,EF Core 尚不支持它,但希望它会支持。
关于在下一次迁移中引入新列应该是表中的第二列时该怎么做的任何提示?
虽然列顺序是按照它们在类中的定义,但正如其他人所指出的,在第一次迁移时,如果您的类继承属性,则子类的属性首先出现,然后是父类中的属性.我会认为它首先是父级,因为在正常继承中,父级的属性在子级之前初始化。【参考方案2】:
更新:在 EF Core 2.1 中,至少对于初始迁移,列将按照在各自类中声明相关属性的顺序添加到表中,而不是按字母顺序。见here。但请注意,在相同表上执行的任何后续实体框架迁移都不会更改之前创建的列的列顺序。
【讨论】:
【参考方案3】:目前EF 核心不支持它。但是有一个解决方法。也就是说,您可以在迁移操作上显式指定 SQL。
不要在迁移中使用CreateTable
方法,而是需要显式编写SQL,如下所示。您可以根据需要指定顺序。
migrationBuilder.Sql("CREATE TABLE Properties(
MyFirstKeyProperty INT NOT NULL,
MySecondKeyProperty int NOT NULL,
AGE INT NOT NULL,
......
......
PRIMARY KEY (MyFirstKeyProperty)
)");
您可以阅读rowanmiller's commnet here about how to sort out that issue just for now
【讨论】:
【参考方案4】:您可以使用此解决方案为您的项目添加对显式列排序的支持:https://github.com/premchandrasingh/EFCoreColumnOrder。此解决方案添加了 HasColumnOrder 扩展方法。 Sample文件夹中有一个使用示例。不要忘记替换 DbContext 中的相应服务。
【讨论】:
这对添加到现有表的新列有什么影响? 如果您使用 HasColumnOrder 扩展方法明确指定列的序号,那么该列将被放置在正确的位置。 这将触发表重建。我不确定这是否真的会发生,如果发生,那将是非常不可取的。你测试过这个场景吗? 此解决方案允许您仅在创建表时指定显式列顺序(EF 迁移中的 CreateTable 方法)。当然,如果表已经存在,这个解决方案不会重建表。【参考方案5】:您提到的列的顺序用于将列的顺序指定为复合外键,因为某些表具有两个或多个字段作为引用其他表的外键,在这种情况下如果你可以使用 Column (Order = n)
【讨论】:
【参考方案6】:从 Entity Framework Core 6 开始,您可以使用注释指定列顺序:
[Column(Order = 1)]
public int Id get; set;
https://docs.microsoft.com/en-us/ef/core/modeling/entity-properties?tabs=data-annotations%2Cwithout-nrt#column-order
【讨论】:
以上是关于EntityFramework 代码优先:设置字段顺序的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework 4.3 - TPH 映射和迁移错误