Я переношу приложение из. Net framework в. Net core
В моем коде генерируется следующий запрос sql
SELECT gt.*,RefTable1.*,RefTable2.*
FROM APP_USER_TO_PGM_PERMISSION AS gt
INNER JOIN APP_USERS AS RefTable1 ON gt.USER_ID=RefTable1.ID
INNER JOIN APP_LK_MODULEPERMISSIONS AS RefTable2
ON gt.PERMISSION_ID=RefTable2.ID
после вызова следующего оператор,
var testLst = db.Set<APP_USER_TO_PGM_PERMISSION>().FromSqlRaw(strQuery).AsNoTracking().ToList();
Исключение "$ exception {" Элемент с таким же ключом уже был добавлен. Ключ: ID "} System.ArgumentException".
stack trace:
at System.ThrowHelper.ThrowAddingDuplicateWithKeyArgumentException[T](T key)
at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)
at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.BuildIndexMap(IReadOnlyList`1 columnNames, DbDataReader dataReader)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.InitializeReader(DbContext _, Boolean result)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
Наблюдается - модуль сопоставления EF Core не поддерживает несколько столбцов с одинаковыми именами, даже если они принадлежат разным таблицам. Он работал с Entity framework.
Метод в коде EF Core, где он не работает
public static int[] BuildIndexMap([CanBeNull] IReadOnlyList<string> columnNames, [NotNull] DbDataReader dataReader)
{
var readerColumns = Enumerable.Range(0, dataReader.FieldCount)
.ToDictionary(dataReader.GetName, i => i, StringComparer.OrdinalIgnoreCase);
var indexMap = new int[columnNames.Count];
for (var i = 0; i < columnNames.Count; i++)
{
var columnName = columnNames[i];
if (!readerColumns.TryGetValue(columnName, out var ordinal))
{
throw new InvalidOperationException(RelationalStrings.FromSqlMissingColumn(columnName));
}
indexMap[i] = ordinal;
}
return indexMap;
}
может ли кто-нибудь помочь?
Я сообщил о проблеме в EFCore https://github.com/dotnet/efcore/issues/21592