Sequence contains more than one matching element в FirstOrDefault

Рейтинг: 0Ответов: 0Опубликовано: 26.01.2023

Получаю ошибку Sequence contains more than one matching element в методе FirstOrDefault. Ошибка появляется в проекте с тестами. Версия EF фреймворков одинаковая. Разница только в версии .NET, основной проект .NET 5.0, проект с тестами .NET 6.0, я очень сомниваюсь что проблема в этом. Получаю ошибку в тесте:

Message:  System.TypeInitializationException : The type initializer for 'Microsoft.EntityFrameworkCore.Query.QueryableMethods' threw an exception. ---- System.InvalidOperationException : Sequence contains more than one matching element

Stack Trace:  QueryableMethods.get_Select() QueryableMethodNormalizingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression) MethodCallExpression.Accept(ExpressionVisitor visitor) ExpressionVisitor.Visit(Expression node) QueryTranslationPreprocessor.NormalizeQueryableMethod(Expression expression) QueryTranslationPreprocessor.Process(Expression query) QueryCompilationContext.CreateQueryExecutor[TResult](Expression query) Database.CompileQuery[TResult](Expression query, Boolean async) QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async) <>c__DisplayClass9_01.<Execute>b__0() CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func1 compiler) QueryCompiler.Execute[TResult](Expression query) EntityQueryProvider.Execute[TResult](Expression expression) Queryable.FirstOrDefault[TSource](IQueryable1 source, Expression1 predicate) MainAPIService.ctor(AppDBContext context, String serverCode, Boolean SSLIgnore) line 24 Service1C8.ctor(AppDBContext context) line 12 Service1C8Tests.CreateRepositoryAsync() line 53 Service1C8Tests.GetGasInfoAsyncNotNULLResult() line 38 <>c.b__128_0(Object state) ----- Inner Stack Trace ----- ThrowHelper.ThrowMoreThanOneMatchException() Enumerable.TryGetSingle[TSource](IEnumerable1 source, Func2 predicate, Boolean& found) Enumerable.Single[TSource](IEnumerable1 source, Func2 predicate) QueryableMethods.cctor()

Сам тест:

public class Service1C8Tests
{
    private DbContextOptions<AppDBContext> dbContextOptions;
    public Service1C8Tests()
    {
        var dbName = $"AuthorPostsDb_{DateTime.Now.ToFileTimeUtc()}";
        dbContextOptions = new DbContextOptionsBuilder<AppDBContext>()
            .UseInMemoryDatabase(dbName)
            .Options;
    }

    [Fact]
    public async void SaveTimeOnPointAsyncNotNULLResult()
    {
        //Arrange
        Service1C8 service = await CreateRepositoryAsync();

        var test = DateTime.Now.ToString("yyyyMMddHHmmss");

        //Act
        ResponseModel1C result =  await service.SaveTimeOnPointAsync("123456", "10", "in");

        //Assert
        Assert.NotNull(result);
    }
    [Fact]
    public async void GetGasInfoAsyncNotNULLResult()
    {
        //Arrange
        Service1C8 service = await CreateRepositoryAsync();

        var test = DateTime.Now.ToString("yyyyMMddHHmmss");

        //Act
        GasResponseModel1C result = await service.GetGasInfoAsync("123456", GasTypeInfo.History);

        //Assert
        Assert.NotNull(result);
    }

    private async Task<Service1C8> CreateRepositoryAsync()
    {
        AppDBContext context = new AppDBContext(dbContextOptions);
        await PopulateDataAsync(context);
        return new Service1C8(context);
    }

    private async Task PopulateDataAsync(AppDBContext context)
    {
        context.RemoteServers.Add(new RemoteServer
        {
            Code = "Service1C8",
            Host = "some",
            Port = "80",
            SSL = false,
            Login = "testserv",
            Password = "1",
            Token = "dGVzdHasdas==",
            TokenLifeEnd = DateTime.Parse("2023-10-19 13:15:26.2500954"),
            AuthorizationHeader = "Basic"

        });

        await context.SaveChangesAsync();
    }
}  

Место где она появляеться:

protected MainAPIService(AppDBContext context, string serverCode, bool SSLIgnore = false)
{
    _context = context;

    _server = _context.RemoteServers 
        .Include(rs => rs.ServiceProxy)
        .FirstOrDefault(s => s.Code == serverCode); //Вот тут выстреливает ексепшен, который я привел выше.

    if(_server == null)
    {
        throw new Exception($"Remote server {serverCode} is NULL! Check DB table!");
    }
    else
    {
        WebProxy proxy = null;

        if (_server.UseProxy)
        {
            proxy = new WebProxy()
            {
                Address = (new UriBuilder(
                    _server.ServiceProxy.ProxySSL ? "https" : "http",
                    _server.ServiceProxy.ProxyHost,
                    _server.ServiceProxy.ProxyPort)).Uri,
                UseDefaultCredentials = _server.ServiceProxy.UseDefaultCredentials,
                BypassProxyOnLocal = _server.ServiceProxy.BypassProxyOnLocal,
            };

            if(!_server.ServiceProxy.UseDefaultCredentials)
            {
                proxy.Credentials = new NetworkCredential(
                    userName: _server.ServiceProxy.Login,
                    password: _server.ServiceProxy.Password
                );
            }
        }

        _httpHelper = new HTTPHelper(
            _server.Host,
            _server.Port,
            _server.SSL,
            SSLIgnore,
            proxy
        );

        TokenAlive = DateTime.Now < _server.TokenLifeEnd;

        if(TokenAlive)
        {
            _httpHelper.SetAuthToken(_server.Token, _server.AuthorizationHeader);
        }
    }
}  

UPD:
EF версия в обоих проектах:5.0.3

AppDbContext:

public class AppDBContext:DbContext
{
    public DbSet<RemoteServer> RemoteServers { get; set; }

    public AppDBContext(DbContextOptions options) : base(options)
    {

    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<RemoteServer>().HasData(
            new RemoteServer[]
            {
                new RemoteServer { Id = 1, Code="RemoteIntegrationServer", Host="", Port="", Login="", Password = "", Name="", SSL=false, Token="", AuthorizationHeader="Bearer", UseProxy = false},
                new RemoteServer { Id = 2, Code="SignServer", Host="", Port="", Login="", Password = "", Name="", SSL=false, Token="", AuthorizationHeader="Bearer", UseProxy = false},
                new RemoteServer { Id = 3, Code="FireBaseProxy", Host="", Port="", Login="", Password = "", Name="", SSL=false, Token="", AuthorizationHeader="Bearer", UseProxy = false},
                new RemoteServer { Id = 4, Code="AlarmServer", Host="", Port="", Login="", Password = "", Name="", SSL=false, Token="", AuthorizationHeader="Bearer", UseProxy = false},
                new RemoteServer { Id = 5, Code="PortalUZDServer", Host="", Port="", Login="", Password = "", Name="", SSL=true, Token="", AuthorizationHeader="Bearer", UseProxy = false},
                new RemoteServer { Id = 6, Code="Service1C8", Host="", Port="", Login="", Password = "", Name="", SSL=false, Token="", AuthorizationHeader="Basic", UseProxy = false},
                new RemoteServer { Id = 7, Code="VodafoneService", Host="", Port="", Login="", Password = "", Name="", SSL=true, Token="", AuthorizationHeader="Bearer", UseProxy = false},
            }
        );

        base.OnModelCreating(modelBuilder);
    }
}  

Global Query Filters нет, Interceptors тоже нет.

Ответы

Ответов пока нет.