Known limitations¶
GraphBridge supports a tested subset of EF Core and Cypher. Anything outside it is refused with an exception before any database work: a query is never moved to the client and evaluated over a whole graph. This page lists the common limits, the supported alternative for each, and the refusal codes. Compatibility lists what is supported.
Common limitations¶
| Operation or symptom | Current limit | Supported alternative |
|---|---|---|
SaveChanges(), ToList() and other synchronous enumeration |
Persistence and query enumeration are async only; pending synchronous writes throw NotSupportedException. EF can return 0 without provider work when nothing changed |
SaveChangesAsync, ToListAsync, await using. ToQueryString() is offline and can be called synchronously. See the async-only decision |
Entity or custom-comparer Contains, joins, grouping, Distinct, set operators, Sum/Average, non-integer or relationship Min/Max |
Not translated. Integer Min/Max on ordinary nodes and bounded scalar Contains are supported |
Fluent Cypher or reviewed native Cypher |
Row-dependent client methods or arithmetic in Select; composition after a DTO projection |
DTO construction from mapped scalars, parameters and nested entities is supported; arbitrary computed expressions are refused | Filter and order before the projection, or use native Cypher with an explicit projector |
Take(...).Where(...), filtering or ordering after paging, repeated Take |
Refused when the server order cannot be preserved | Filter and order before paging when that keeps your meaning; otherwise native Cypher |
Nested, filtered, multiple or string Include |
One direct native-reference Include is supported (references); association and identified-relationship Include are not |
Query the relationship or node roots explicitly, or a second query by key |
| Required foreign-key reassignment, moving a relationship to other endpoints | Required references and tracked relationship endpoints keep their identity | Optional references support parent changes. Otherwise replace the relationship with a new key or use a reviewed migration; changing an endpoint key does not move a relationship |
| Missing key constraints or duplicate graph identities | Saves require reviewed uniqueness constraints; malformed identities are refused | Inspect and deploy a reviewed schema change (schema and migrations). Queries and saves never repair schema or data |
ReloadAsync, GetDatabaseValuesAsync |
Their projection is refused | Read in a fresh context. Rollback does not rewind values EF already accepted (transactions) |
| Retry after a lost commit acknowledgement | A connection error does not prove rollback; there is no automatic retry or exactly-once guarantee | Check durable state with application IDs in a fresh context first (recovery) |
| Owned, complex or inherited entities; arbitrary converter operations | Unsupported mappings are refused; a conversion does not prove operator equivalence | Explicit graph entities and scalars with reversible conversions; check the specific comparison or ordering (nulls, types and time) |
ExecuteUpdateAsync, ExecuteDeleteAsync |
At most 10,000 selected rows, scalar setters only; keys, endpoints, Include and projected roots are refused; tracked entities are not updated |
Bulk mutations; a failure aborts the whole current transaction |
Refusal codes¶
A refused LINQ query throws Neo4jQueryTranslationException before any database work. Its message names the shape in LINQ terms, a stable code and a supported alternative, for example GraphBridge cannot translate GroupBy [GBQ101]. Group in Fluent Cypher with With(...) .... The code is in the exception's Code property and in Exception.Data["GraphBridge.QueryDiagnostic"], and Doctor reports it as the subcode of GBD-QUERY-001. Match on the code, not the message text. Fluent Cypher refusals throw FluentCypherException with GBFC codes (Fluent Cypher).
| Code | Refused | Supported alternative |
|---|---|---|
| GBQ100 | Other unsupported shapes, such as unmapped roots or properties | The documented subset, or a reviewed native query |
| GBQ101 | GroupBy |
Fluent Cypher With(...) with Graph.Count, Min, Max, Sum or Avg, or grouping a bounded list in memory |
| GBQ102 | Distinct |
Fluent ReturnDistinct, or de-duplicating a bounded projected list |
| GBQ103 | Join, GroupJoin, LeftJoin, RightJoin, SelectMany |
Match the relationship in Fluent Cypher, or query each side and join a bounded result |
| GBQ104 | Union, Concat, Intersect, Except |
Separate queries combined in memory, or a reviewed native query |
| GBQ105 | Sum, Average, and Min/Max beyond direct int/long properties |
Fluent Graph.Sum, Avg, Min, Max, or integer aggregates |
| GBQ106 | Last, Reverse, ElementAt, SkipWhile, TakeWhile |
Opposite ordering with First, or Skip(n) with First |
| GBQ107 | OfType, Cast |
The mapped type's own DbSet |
| GBQ108 | All, DefaultIfEmpty |
Any with the opposite condition, or Fluent OPTIONAL MATCH |
| GBQ110 | Operators after Skip/Take, repeated Take, subqueries |
Apply operators before paging, or split the query |
| GBQ120 | Methods or computation over entity members, unsupported predicate operators and converter comparisons | Compare mapped scalars with variables or constants |
| GBQ130 | Unsupported Contains shapes |
Contains over a captured array or List<T> of supported scalars (at most 1,024) |
| GBQ140 | Nested, filtered, multiple or string Include |
One direct native-reference Include, or a second query by key |
| GBQ150 | Projections beyond mapped scalars and DTOs | DTO projections |
| GBQ160 | Unsupported ExecuteUpdateAsync/ExecuteDeleteAsync shapes |
Direct scalar setters on a mapped entity root (bulk mutations) |
| GBQ170 | Aggregates over association, identified-relationship or native-reference roots | Aggregate the related node set, or a reviewed native query |
Reporting a limitation¶
Model mapping errors come from model validation; query refusals from the unsupported-method visitor. When you report one, include a small synthetic model, the LINQ shape, the refusal code, exact versions and the exception type. Remove credentials and application values. The behavior matrix maps each supported behavior to its tests.
Try it¶
Workshop lesson 06 ยท The failure lab triggers the common refusals and shows each code and alternative.