EF Core 3.1.1 - FromSQLRaw - несколько имен столбцов с одинаковым именем при выборе из разных таблиц в операторе sql - PullRequest
0 голосов
/ 11 июля 2020

Я переношу приложение из. 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

...