EntityGraphQL: Union error: "variable '....' of type '....' referenced from scope '', but it is not defined"
We have some code that uses unions, like so:
public interface IUser { }
public class Employee : IUser
{
public string Name { get; set; }
}
public class UsersContext : IUsersContext
{
public List<IUser> Users { get; set; } = new()
{
new Employee
{
Name = "test user"
}
};
}
public interface IUsersContext
{
public List<IUser> Users { get; }
}
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors();
builder.Services.AddTransient<IUsersContext, UsersContext>();
builder.Services.AddGraphQLSchema<IUsersContext>(options =>
{
options.AutoBuildSchemaFromContext = false;
options.ConfigureSchema = (schema) =>
{
schema.AddUnion<IUser>("user", null);
schema.Type<IUser>().AddAllPossibleTypes();
schema.UpdateQuery(queryType =>
{
queryType.ReplaceField(
"users",
db => db.Users,
null
);
});
};
});
var app = builder.Build();
app.UseHttpsRedirection();
app.UseRouting();
app.UseCors(builder =>
{
builder
.WithOrigins("*")
.WithMethods("POST")
.AllowAnyHeader();
});
app.UseEndpoints(endpoints => endpoints.MapGraphQL<IUsersContext>());
app.Run();
}
}
When I execute this query:
{
users
{
... on Employee
{
name
}
}
}
I get this exception:
System.InvalidOperationException
HResult=0x80131509
Message=variable 'p_Employee' of type 'Example.Employee' referenced from scope '', but it is not defined
Source=System.Linq.Expressions
StackTrace:
at System.Linq.Expressions.Compiler.VariableBinder.Reference(ParameterExpression node, VariableStorageKind storage)
at System.Linq.Expressions.Compiler.VariableBinder.VisitParameter(ParameterExpression node)
at System.Linq.Expressions.ParameterExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.Compiler.VariableBinder.Visit(Expression node)
at System.Linq.Expressions.MemberExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.Compiler.VariableBinder.Visit(Expression node)
at System.Linq.Expressions.ExpressionVisitor.VisitMemberBinding(MemberBinding node)
at System.Linq.Expressions.ExpressionVisitor.Visit[T](ReadOnlyCollection`1 nodes, Func`2 elementVisitor)
at System.Linq.Expressions.ExpressionVisitor.VisitMemberInit(MemberInitExpression node)
at System.Linq.Expressions.MemberInitExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.Compiler.VariableBinder.Visit(Expression node)
at System.Linq.Expressions.ExpressionVisitor.Visit(ReadOnlyCollection`1 nodes)
at System.Linq.Expressions.Compiler.VariableBinder.VisitLambda[T](Expression`1 node)
at System.Linq.Expressions.Expression`1.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.Compiler.VariableBinder.Visit(Expression node)
at System.Dynamic.Utils.ExpressionVisitorUtils.VisitArguments(ExpressionVisitor visitor, IArgumentProvider nodes)
at System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression node)
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.Compiler.VariableBinder.Visit(Expression node)
at System.Dynamic.Utils.ExpressionVisitorUtils.VisitArguments(ExpressionVisitor visitor, IArgumentProvider nodes)
at System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression node)
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.Compiler.VariableBinder.Visit(Expression node)
at System.Linq.Expressions.ExpressionVisitor.Visit(ReadOnlyCollection`1 nodes)
at System.Linq.Expressions.Compiler.VariableBinder.VisitLambda[T](Expression`1 node)
at System.Linq.Expressions.Expression`1.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.Compiler.VariableBinder.Visit(Expression node)
at System.Linq.Expressions.Compiler.LambdaCompiler.Compile(LambdaExpression lambda)
at System.Linq.Expressions.LambdaExpression.Compile()
at EntityGraphQL.Compiler.ExecutableGraphQLStatement.<ExecuteExpressionAsync>d__32.MoveNext() in EntityGraphQL\Compiler\GqlNodes\ExecutableGraphQLStatement.cs:line 244
The error message appears to be similar to #239, but the repro steps are different.
This was tested with commit 099aad8cdb3b6c8f4dbc4b17b4727ba408dfb0f3
About this issue
- Original URL
- State: closed
- Created 2 years ago
- Comments: 24 (11 by maintainers)
Commits related to this issue
- support for serializing subclasses (#264) — committed to bzbetty/EntityGraphQL by SamMcKoy 2 years ago
- Merge pull request #269 from bzbetty/serializeInheritedTypes support for serializing subclasses (#264) — committed to EntityGraphQL/EntityGraphQL by lukemurray 2 years ago
- Merge pull request #271 from bzbetty/serializationFixes Serialization fixes for #264 — committed to EntityGraphQL/EntityGraphQL by lukemurray 2 years ago
oh interesting, my error seems to be due to not wrapping the sample app in a namespace - that’s really confusing!