FreeSql icon indicating copy to clipboard operation
FreeSql copied to clipboard

使用FreeSql.Generator对SqlServer数据库表生成的实体属性位置和表中不一致

Open mildspark opened this issue 3 years ago • 5 comments

FreeSql.Generator版本:3.2.665

表中显示顺序如下 image

但是生成的实体属性是按照字典顺序排的 image

生成模板中如果按照字段的Position来排序,显示顺序也不正常 image

查看了issues#1154,又看了下源代码,好像PgSql和Mysql是获取字段的ordinal_position之后根据ordinal_position来设置Position,而SqlServer是通过++position的方式来迭代position。 image

mildspark avatar Aug 05 '22 05:08 mildspark

后面还有逻辑,顺序是:

主键 外键 名称排序

2881099 avatar Aug 05 '22 06:08 2881099

loc4.Primarys.Sort((c1, c2) => c1.Name.CompareTo(c2.Name));
loc4.Columns.Sort((c1, c2) =>
{
    int compare = c2.IsPrimary.CompareTo(c1.IsPrimary);
    if (compare == 0)
    {
        bool b1 = loc4.ForeignsDict.Values.Where(fk => fk.Columns.Where(c3 => c3.Name == c1.Name).Any()).Any();
        bool b2 = loc4.ForeignsDict.Values.Where(fk => fk.Columns.Where(c3 => c3.Name == c2.Name).Any()).Any();
        compare = b2.CompareTo(b1);
    }
    if (compare == 0) compare = c1.Name.CompareTo(c2.Name);
    return compare;
});

2881099 avatar Aug 05 '22 06:08 2881099

希望不是用默认的排序,而是能通过Position排序之后生成模板,参照OdbcMySqlDbFirst.cs中取ordinal_position来设置Position,对SqlServerDbFirst.cs进行了下修改,取sys.columns中的column_id来作为Position,之后在模板文件中根据Postion把字段排序,可以获得想要的结果 image

image

image

mildspark avatar Aug 05 '22 07:08 mildspark

谢谢,已测试 sqlserver 2005 通过

2881099 avatar Aug 05 '22 11:08 2881099

dotnet tool 新版本可以直接编译后安装:

编译前需要把 FreeSql.Generator 项目的版本号改大一点(比当前已安装的要大)

> cd C:\Users\28810\Desktop\github\FreeSql\Extensions\FreeSql.Generator\bin\Debug
> dotnet tool update -g FreeSql.Generator --add-source ./

如果不方便编译,可以下载我临时编译的版本 3.2.665.1,只编译了net6,不然文件太大无法上传

FreeSql.Generator.3.2.665.1.nupkg.zip

2881099 avatar Aug 05 '22 11:08 2881099