programing

Mariadb에서 EntityFrameworkCore를 사용하여 재귀 SQL을 실행할 때 오류 발생

instargram 2023. 7. 16. 12:31
반응형

Mariadb에서 EntityFrameworkCore를 사용하여 재귀 SQL을 실행할 때 오류 발생

Entity Framewear Core(.NET 7)에서 다음을 사용/구축하는 방법에 대한 도움말이 필요합니다.

그 중에서, 저는 다음과 같은 한 가지 수업이 있습니다.

public class ApplicationModel{
    public int Id { get; set; }
    public string AppName { get; set; }
    public List<ApplicationModel>? Parent { get; set; }
    public List<ApplicationModel>? Son { get; set; }
}

이러한 반사적 관계는 두 개의 테이블을 생성합니다(MariaDb/Pomelo 7.0.0-silver.1 사용).

  1. 테이블 응용 프로그램 모델
  2. 테이블 응용 프로그램 모델 응용 프로그램 모델

목표는 재귀적 SQL을 실행하여 부모 대 아들 관계를 보여주는 트리를 만드는 것입니다.

스키마쿼리의 예를 여기에서 찾으십시오.

결과를 보면 다음과 같은 것을 알 수 있습니다.

  • A는 B의 부모이고,
  • B는 C와 D의 부모입니다.
  • D는 E 등의 부모입니다.

질문: Service.cs 에서 어떻게 코딩할 수 있습니까?

저는 mariadb 프로시저(이름 GET_Dependencies, HeidiSql에서 제대로 작동)를 만들려고 노력했지만, 제 Service.cs 에서,

         var result = await _dbContext.ApplicationModels
            .FromSqlInterpolated(
            $"CALL `GET_DEPENDENCIES` (1)")
            .ToListAsync();

다음 오류가 발생했습니다.

System.ArgumentException: An item with the same key has already been added. Key: AppName
   at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)
   at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
   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.FromSqlQueryingEnumerable`1.BuildIndexMap(IReadOnlyList`1 columnNames, DbDataReader dataReader)
   at Microsoft.EntityFrameworkCore.Query.Internal.FromSqlQueryingEnumerable`1.Enumerator.InitializeReader(Enumerator enumerator)
   at Microsoft.EntityFrameworkCore.Query.Internal.FromSqlQueryingEnumerable`1.Enumerator.<>c.<MoveNext>b__21_0(DbContext _, Enumerator enumerator)
   at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.Query.Internal.FromSqlQueryingEnumerable`1.Enumerator.MoveNext()

누가 절차를 사용하여 어떻게 하는지 안내해 주시겠습니까?

안부 전해요,

알겠습니다! (아마 더 좋은 방법은 아닐 것입니다)

필요한 정확한 dto를 만들었습니다.

public class AppDepDto
{
public string Parent { get; set; }
public string Son { get; set; }
}

dbContext.cs 에서, 저는 광고 세트를 추가했습니다.

 public DbSet<AppDepDto> AppDepDtos { get; set; }

OnModel에 키가 없다는 사실을 추가해야 했습니다. (링크)

builder
    .Entity<AppDepDto>(
        eb =>
        {
            eb.HasNoKey();
        });

마지막으로, 저의 서비스는 다음과 같습니다.

public async Task<List<AppDepDto>> GetApplicationDependenciesAsync(int id)
    {
        var liste = await _dbContext.AppDepDtos
            .FromSqlInterpolated($"CALL GET_DEPENDENCIES(1)")
            .ToListAsync();


        return liste;
    }

결과:

[   {
    "parent": "A",
    "son": "B"   },   {
    "parent": "B",
    "son": "C"   },   {
    "parent": "B",
    "son": "D"   },   {
    "parent": "D",
    "son": "E"   } ]

언급URL : https://stackoverflow.com/questions/75235864/error-when-running-a-recursive-sql-with-entityframework-core-in-mariadb

반응형