Skip to content

Commit 80891c2

Browse files
Update YdbDatabaseModelFactory.cs (#301)
1 parent f2b859f commit 80891c2

File tree

1 file changed

+67
-55
lines changed

1 file changed

+67
-55
lines changed

src/EfCore.Ydb/src/Scaffolding/Internal/YdbDatabaseModelFactory.cs

Lines changed: 67 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -21,85 +21,97 @@ public override DatabaseModel Create(string connectionString, DatabaseModelFacto
2121
public override DatabaseModel Create(DbConnection connection, DatabaseModelFactoryOptions options)
2222
{
2323
var ydbConnection = (YdbConnection)connection;
24-
if (connection.State != ConnectionState.Open)
25-
{
26-
connection.Open();
27-
}
28-
29-
var tableNames = new List<string>();
30-
tableNames.AddRange(options.Tables);
24+
var connectionStartedOpen = ydbConnection.State == ConnectionState.Open;
3125

32-
if (tableNames.Count == 0)
26+
if (!connectionStartedOpen)
3327
{
34-
tableNames.AddRange(
35-
from ydbObject in YdbSchema.SchemaObjects(ydbConnection).GetAwaiter().GetResult()
36-
where ydbObject.Type is SchemeType.Table or SchemeType.ColumnTable or SchemeType.ExternalTable &&
37-
!ydbObject.IsSystem
38-
select ydbObject.Name
39-
);
28+
ydbConnection.Open();
4029
}
4130

42-
var databaseModel = new DatabaseModel
31+
try
4332
{
44-
DatabaseName = connection.Database
45-
};
33+
var tableNames = new List<string>();
34+
tableNames.AddRange(options.Tables);
4635

47-
foreach (var ydbTable in tableNames.Select(tableName =>
48-
YdbSchema.DescribeTable(ydbConnection, tableName).GetAwaiter().GetResult()))
49-
{
50-
var databaseTable = new DatabaseTable
36+
if (tableNames.Count == 0)
5137
{
52-
Name = ydbTable.Name,
53-
Database = databaseModel
54-
};
38+
tableNames.AddRange(
39+
from ydbObject in YdbSchema.SchemaObjects(ydbConnection).GetAwaiter().GetResult()
40+
where ydbObject.Type is SchemeType.Table or SchemeType.ColumnTable or SchemeType.ExternalTable &&
41+
!ydbObject.IsSystem
42+
select ydbObject.Name
43+
);
44+
}
5545

56-
var columnNameToDatabaseColumn = new Dictionary<string, DatabaseColumn>();
46+
var databaseModel = new DatabaseModel
47+
{
48+
DatabaseName = connection.Database
49+
};
5750

58-
foreach (var column in ydbTable.Columns)
51+
foreach (var ydbTable in tableNames.Select(tableName =>
52+
YdbSchema.DescribeTable(ydbConnection, tableName).GetAwaiter().GetResult()))
5953
{
60-
var databaseColumn = new DatabaseColumn
54+
var databaseTable = new DatabaseTable
6155
{
62-
Name = column.Name,
63-
Table = databaseTable,
64-
StoreType = column.StorageType,
65-
IsNullable = column.IsNullable
56+
Name = ydbTable.Name,
57+
Database = databaseModel
6658
};
6759

68-
databaseTable.Columns.Add(databaseColumn);
69-
columnNameToDatabaseColumn[column.Name] = databaseColumn;
70-
}
60+
var columnNameToDatabaseColumn = new Dictionary<string, DatabaseColumn>();
7161

72-
foreach (var index in ydbTable.Indexes)
73-
{
74-
var databaseIndex = new DatabaseIndex
62+
foreach (var column in ydbTable.Columns)
7563
{
76-
Name = index.Name,
77-
Table = databaseTable,
78-
IsUnique = index.Type == YdbTableIndex.IndexType.GlobalUniqueIndex
64+
var databaseColumn = new DatabaseColumn
65+
{
66+
Name = column.Name,
67+
Table = databaseTable,
68+
StoreType = column.StorageType,
69+
IsNullable = column.IsNullable
70+
};
71+
72+
databaseTable.Columns.Add(databaseColumn);
73+
columnNameToDatabaseColumn[column.Name] = databaseColumn;
74+
}
75+
76+
foreach (var index in ydbTable.Indexes)
77+
{
78+
var databaseIndex = new DatabaseIndex
79+
{
80+
Name = index.Name,
81+
Table = databaseTable,
82+
IsUnique = index.Type == YdbTableIndex.IndexType.GlobalUniqueIndex
83+
};
84+
85+
foreach (var columnName in index.IndexColumns)
86+
{
87+
databaseIndex.Columns.Add(columnNameToDatabaseColumn[columnName]);
88+
databaseIndex.IsDescending.Add(false);
89+
}
90+
91+
databaseTable.Indexes.Add(databaseIndex);
92+
}
93+
94+
databaseTable.PrimaryKey = new DatabasePrimaryKey
95+
{
96+
Name = null // YDB does not have a primary key named
7997
};
8098

81-
foreach (var columnName in index.IndexColumns)
99+
foreach (var columnName in ydbTable.PrimaryKey)
82100
{
83-
databaseIndex.Columns.Add(columnNameToDatabaseColumn[columnName]);
84-
databaseIndex.IsDescending.Add(false);
101+
databaseTable.PrimaryKey.Columns.Add(columnNameToDatabaseColumn[columnName]);
85102
}
86103

87-
databaseTable.Indexes.Add(databaseIndex);
104+
databaseModel.Tables.Add(databaseTable);
88105
}
89106

90-
databaseTable.PrimaryKey = new DatabasePrimaryKey
91-
{
92-
Name = null // YDB does not have a primary key named
93-
};
94-
95-
foreach (var columnName in ydbTable.PrimaryKey)
107+
return databaseModel;
108+
}
109+
finally
110+
{
111+
if (!connectionStartedOpen)
96112
{
97-
databaseTable.PrimaryKey.Columns.Add(columnNameToDatabaseColumn[columnName]);
113+
ydbConnection.Close();
98114
}
99-
100-
databaseModel.Tables.Add(databaseTable);
101115
}
102-
103-
return databaseModel;
104116
}
105117
}

0 commit comments

Comments
 (0)