[{"data":1,"prerenderedAt":1883},["ShallowReactive",2],{"navigation":3,"\u002Fguides\u002Fef-core-store":170,"\u002Fguides\u002Fef-core-store-surround":1878},[4,25,104,150,160],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-book-open",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-rocket",{"title":26,"icon":6,"path":27,"stem":28,"children":29,"page":6},"Guides","\u002Fguides","2.guides",[30,35,40,45,50,55,60,65,70,75,79,84,89,94,99],{"title":31,"path":32,"stem":33,"icon":34},"Seeds and TestBiome","\u002Fguides\u002Fseeds-and-testbiome","2.guides\u002F01.seeds-and-testbiome","i-lucide-sprout",{"title":36,"path":37,"stem":38,"icon":39},"Blueprints","\u002Fguides\u002Fblueprints","2.guides\u002F02.blueprints","i-lucide-drafting-compass",{"title":41,"path":42,"stem":43,"icon":44},"Customizing","\u002Fguides\u002Fcustomizing","2.guides\u002F03.customizing","i-lucide-sliders-horizontal",{"title":46,"path":47,"stem":48,"icon":49},"Parent\u002Fchild chains and .Under","\u002Fguides\u002Fparents-and-children","2.guides\u002F04.parents-and-children","i-lucide-git-fork",{"title":51,"path":52,"stem":53,"icon":54},"Fan-out","\u002Fguides\u002Ffan-out","2.guides\u002F05.fan-out","i-lucide-split",{"title":56,"path":57,"stem":58,"icon":59},"Sequences","\u002Fguides\u002Fsequences","2.guides\u002F06.sequences","i-lucide-list-ordered",{"title":61,"path":62,"stem":63,"icon":64},"Time and precision","\u002Fguides\u002Ftime-and-precision","2.guides\u002F07.time-and-precision","i-lucide-clock",{"title":66,"path":67,"stem":68,"icon":69},"Transients","\u002Fguides\u002Ftransients","2.guides\u002F08.transients","i-lucide-ghost",{"title":71,"path":72,"stem":73,"icon":74},"Aggregates","\u002Fguides\u002Faggregates","2.guides\u002F09.aggregates","i-lucide-boxes",{"title":76,"path":77,"stem":78,"icon":74},"Input blueprints","\u002Fguides\u002Finput-blueprints","2.guides\u002F09.input-blueprints",{"title":80,"path":81,"stem":82,"icon":83},"Save hooks and global defaults","\u002Fguides\u002Fsave-hooks-and-defaults","2.guides\u002F10.save-hooks-and-defaults","i-lucide-webhook",{"title":85,"path":86,"stem":87,"icon":88},"EF Core store","\u002Fguides\u002Fef-core-store","2.guides\u002F11.ef-core-store","i-lucide-database",{"title":90,"path":91,"stem":92,"icon":93},"No-DB unit tests","\u002Fguides\u002Fno-db-unit-tests","2.guides\u002F12.no-db-unit-tests","i-lucide-flask-conical",{"title":95,"path":96,"stem":97,"icon":98},"Generated grafts and scenario helpers","\u002Fguides\u002Fscenario-helpers-and-sugar","2.guides\u002F13.scenario-helpers-and-sugar","i-lucide-wand-sparkles",{"title":100,"path":101,"stem":102,"icon":103},"Constructor setup","\u002Fguides\u002Fconstructor-setup","2.guides\u002F14.constructor-setup","i-lucide-blocks",{"title":105,"path":106,"stem":107,"children":108,"icon":6},"Examples","\u002Fexamples","3.examples\u002F1.index",[109,111,116,121,126,130,135,140,145],{"title":105,"path":106,"stem":107,"icon":110},"i-lucide-library",{"title":112,"path":113,"stem":114,"icon":115},"Code reviews","\u002Fexamples\u002Fcode-reviews","3.examples\u002F2.code-reviews","i-lucide-git-pull-request",{"title":117,"path":118,"stem":119,"icon":120},"Membership","\u002Fexamples\u002Fmembership","3.examples\u002F3.membership","i-lucide-users",{"title":122,"path":123,"stem":124,"icon":125},"Board","\u002Fexamples\u002Fboard","3.examples\u002F4.board","i-lucide-kanban",{"title":127,"path":128,"stem":129,"icon":44},"Custom seed","\u002Fexamples\u002Fcustom-seed","3.examples\u002F5.custom-seed",{"title":131,"path":132,"stem":133,"icon":134},"Commerce","\u002Fexamples\u002Fcommerce","3.examples\u002F6.commerce","i-lucide-shopping-cart",{"title":136,"path":137,"stem":138,"icon":139},"Project management","\u002Fexamples\u002Fproject-management","3.examples\u002F7.project-management","i-lucide-folder-kanban",{"title":141,"path":142,"stem":143,"icon":144},"Learning","\u002Fexamples\u002Flearning","3.examples\u002F8.learning","i-lucide-graduation-cap",{"title":146,"path":147,"stem":148,"icon":149},"Docs ingest","\u002Fexamples\u002Fdocs-ingest","3.examples\u002F9.docs-ingest","i-lucide-file-search",{"title":151,"icon":6,"path":152,"stem":153,"children":154,"page":6},"Reference","\u002Freference","4.reference",[155],{"title":156,"path":157,"stem":158,"icon":159},"API cheat sheet","\u002Freference\u002Fapi-cheat-sheet","4.reference\u002F1.api-cheat-sheet","i-lucide-list-checks",{"title":161,"icon":6,"path":162,"stem":163,"children":164,"page":6},"Agent Skills","\u002Fagents","5.agents",[165],{"title":166,"path":167,"stem":168,"icon":169},"Agent skills","\u002Fagents\u002Fagent-skills","5.agents\u002F1.agent-skills","i-lucide-bot",{"id":171,"title":85,"body":172,"description":1871,"extension":1872,"links":1873,"meta":1874,"navigation":1875,"path":86,"seo":1876,"stem":87,"__hash__":1877},"docs\u002F2.guides\u002F11.ef-core-store.md",{"type":173,"value":174,"toc":1863},"minimark",[175,180,201,415,430,660,673,677,693,699,703,706,926,1159,1169,1173,1176,1588,1592,1599,1741,1745,1751,1859],[176,177,179],"h2",{"id":178},"wire-it-up","Wire it up",[181,182,183,184,188,189,192,193,196,197,200],"p",{},"When the behavior you want to test reads from a database, the graph needs to be persisted first. ",[185,186,187],"code",{},"BuildAsync"," passes it to an ",[185,190,191],{},"IBiomeStore",", with seed rows followed by created entities. The EF Core package supplies ",[185,194,195],{},"EfCoreStore",", so you can use the ",[185,198,199],{},"DbContext"," your test already owns:",[202,203,211],"pre",{"className":204,"code":205,"filename":206,"highlights":207,"language":209,"meta":210,"style":210},"language-csharp shiki shiki-themes material-theme-lighter github-light github-dark","using Microsoft.EntityFrameworkCore;\nusing Zeeq.Biome.EntityFrameworkCore;\n\npublic static partial class TestBiome\n{\n    public static BiomeBuilder\u003CZeeqSeed, ZeeqSeed> Start(\n        DbContext db,\n        out ZeeqSeed seed,\n        TimeProvider? time = null\n    ) => Start(out seed, db.AsBiomeStore(), time); \u002F\u002F or: new EfCoreStore(db)\n}\n","TestBiome.cs",[208],10,"csharp","",[185,212,213,236,255,262,283,289,322,334,347,367,409],{"__ignoreMap":210},[214,215,218,222,226,230,233],"span",{"class":216,"line":217},"line",1,[214,219,221],{"class":220},"sw1J6","using",[214,223,225],{"class":224},"sfCm-"," Microsoft",[214,227,229],{"class":228},"sP7_E",".",[214,231,232],{"class":224},"EntityFrameworkCore",[214,234,235],{"class":228},";\n",[214,237,239,241,244,246,249,251,253],{"class":216,"line":238},2,[214,240,221],{"class":220},[214,242,243],{"class":224}," Zeeq",[214,245,229],{"class":228},[214,247,248],{"class":224},"Biome",[214,250,229],{"class":228},[214,252,232],{"class":224},[214,254,235],{"class":228},[214,256,258],{"class":216,"line":257},3,[214,259,261],{"emptyLinePlaceholder":260},true,"\n",[214,263,265,269,272,275,279],{"class":216,"line":264},4,[214,266,268],{"class":267},"sbsja","public",[214,270,271],{"class":267}," static",[214,273,274],{"class":267}," partial",[214,276,278],{"class":277},"sG8yY"," class",[214,280,282],{"class":281},"sbgvK"," TestBiome\n",[214,284,286],{"class":216,"line":285},5,[214,287,288],{"class":228},"{\n",[214,290,292,295,297,300,303,306,309,312,315,319],{"class":216,"line":291},6,[214,293,294],{"class":267},"    public",[214,296,271],{"class":267},[214,298,299],{"class":281}," BiomeBuilder",[214,301,302],{"class":228},"\u003C",[214,304,305],{"class":281},"ZeeqSeed",[214,307,308],{"class":228},",",[214,310,311],{"class":281}," ZeeqSeed",[214,313,314],{"class":228},">",[214,316,318],{"class":317},"sGLFI"," Start",[214,320,321],{"class":228},"(\n",[214,323,325,328,331],{"class":216,"line":324},7,[214,326,327],{"class":281},"        DbContext",[214,329,330],{"class":281}," db",[214,332,333],{"class":228},",\n",[214,335,337,340,342,345],{"class":216,"line":336},8,[214,338,339],{"class":267},"        out",[214,341,311],{"class":281},[214,343,344],{"class":281}," seed",[214,346,333],{"class":228},[214,348,350,353,356,359,363],{"class":216,"line":349},9,[214,351,352],{"class":281},"        TimeProvider",[214,354,355],{"class":228},"?",[214,357,358],{"class":281}," time",[214,360,362],{"class":361},"smGrS"," =",[214,364,366],{"class":365},"s39Yj"," null\n",[214,368,371,374,377,379,382,385,388,390,392,394,397,400,402,405],{"class":369,"line":208},[216,370],"highlight",[214,372,373],{"class":228},"    )",[214,375,376],{"class":361}," =>",[214,378,318],{"class":317},[214,380,381],{"class":228},"(",[214,383,384],{"class":267},"out",[214,386,344],{"class":387},"su5hD",[214,389,308],{"class":228},[214,391,330],{"class":387},[214,393,229],{"class":228},[214,395,396],{"class":317},"AsBiomeStore",[214,398,399],{"class":228},"(),",[214,401,358],{"class":387},[214,403,404],{"class":228},");",[214,406,408],{"class":407},"sutJx"," \u002F\u002F or: new EfCoreStore(db)\n",[214,410,412],{"class":216,"line":411},11,[214,413,414],{"class":228},"}\n",[181,416,417,420,421,424,425,429],{},[185,418,419],{},"db.AsBiomeStore()"," and ",[185,422,423],{},"new EfCoreStore(db)"," are equivalent. The store ",[426,427,428],"strong",{},"does not own"," the context: you create, reuse and dispose it.",[431,432,433,531],"code-group",{},[202,434,438],{"className":204,"code":435,"filename":436,"highlights":437,"language":209,"meta":210,"style":210},"await TestBiome\n    .Start(_db, out var seed)\n    .AddLockedReview(out var activeLock)\n    .BuildAsync(); \u002F\u002F AddRange in order, one SaveChangesAsync\n\n\u002F\u002F so the code under test reads rows from the database, not tracked instances\n_db.ChangeTracker.Clear();\n","With Biome",[264,324],[185,439,440,447,473,491,504,508,513],{"__ignoreMap":210},[214,441,442,445],{"class":216,"line":217},[214,443,444],{"class":361},"await",[214,446,282],{"class":387},[214,448,449,452,455,457,460,462,465,468,470],{"class":216,"line":238},[214,450,451],{"class":228},"    .",[214,453,454],{"class":317},"Start",[214,456,381],{"class":228},[214,458,459],{"class":387},"_db",[214,461,308],{"class":228},[214,463,464],{"class":267}," out",[214,466,467],{"class":277}," var",[214,469,344],{"class":281},[214,471,472],{"class":228},")\n",[214,474,475,477,480,482,484,486,489],{"class":216,"line":257},[214,476,451],{"class":228},[214,478,479],{"class":317},"AddLockedReview",[214,481,381],{"class":228},[214,483,384],{"class":267},[214,485,467],{"class":277},[214,487,488],{"class":281}," activeLock",[214,490,472],{"class":228},[214,492,494,496,498,501],{"class":493,"line":264},[216,370],[214,495,451],{"class":228},[214,497,187],{"class":317},[214,499,500],{"class":228},"();",[214,502,503],{"class":407}," \u002F\u002F AddRange in order, one SaveChangesAsync\n",[214,505,506],{"class":216,"line":285},[214,507,261],{"emptyLinePlaceholder":260},[214,509,510],{"class":216,"line":291},[214,511,512],{"class":407},"\u002F\u002F so the code under test reads rows from the database, not tracked instances\n",[214,514,516,518,520,523,525,528],{"class":515,"line":324},[216,370],[214,517,459],{"class":387},[214,519,229],{"class":228},[214,521,522],{"class":387},"ChangeTracker",[214,524,229],{"class":228},[214,526,527],{"class":317},"Clear",[214,529,530],{"class":228},"();\n",[532,533,536],"code-collapse",{"label":534,"name":535},"Without Biome","setup",[202,537,539],{"className":204,"code":538,"language":209,"meta":210,"style":210},"var seed = ZeeqSeed.Generate();\n\n\u002F* … construct repo, pr, review, activeLock with every ID, FK and timestamp … *\u002F\n\n_db.AddRange(seed.Owner, seed.Organization);\n_db.AddRange(repo, pr, review, activeLock);\nawait _db.SaveChangesAsync();\n_db.ChangeTracker.Clear();\n",[185,540,541,559,563,568,572,603,632,646],{"__ignoreMap":210},[214,542,543,546,548,550,552,554,557],{"class":216,"line":217},[214,544,545],{"class":277},"var",[214,547,344],{"class":281},[214,549,362],{"class":361},[214,551,311],{"class":387},[214,553,229],{"class":228},[214,555,556],{"class":317},"Generate",[214,558,530],{"class":228},[214,560,561],{"class":216,"line":238},[214,562,261],{"emptyLinePlaceholder":260},[214,564,565],{"class":216,"line":257},[214,566,567],{"class":407},"\u002F* … construct repo, pr, review, activeLock with every ID, FK and timestamp … *\u002F\n",[214,569,570],{"class":216,"line":264},[214,571,261],{"emptyLinePlaceholder":260},[214,573,574,576,578,581,583,586,588,591,593,595,597,600],{"class":216,"line":285},[214,575,459],{"class":387},[214,577,229],{"class":228},[214,579,580],{"class":317},"AddRange",[214,582,381],{"class":228},[214,584,585],{"class":387},"seed",[214,587,229],{"class":228},[214,589,590],{"class":387},"Owner",[214,592,308],{"class":228},[214,594,344],{"class":387},[214,596,229],{"class":228},[214,598,599],{"class":387},"Organization",[214,601,602],{"class":228},");\n",[214,604,605,607,609,611,613,616,618,621,623,626,628,630],{"class":216,"line":291},[214,606,459],{"class":387},[214,608,229],{"class":228},[214,610,580],{"class":317},[214,612,381],{"class":228},[214,614,615],{"class":387},"repo",[214,617,308],{"class":228},[214,619,620],{"class":387}," pr",[214,622,308],{"class":228},[214,624,625],{"class":387}," review",[214,627,308],{"class":228},[214,629,488],{"class":387},[214,631,602],{"class":228},[214,633,634,636,639,641,644],{"class":216,"line":324},[214,635,444],{"class":361},[214,637,638],{"class":387}," _db",[214,640,229],{"class":228},[214,642,643],{"class":317},"SaveChangesAsync",[214,645,530],{"class":228},[214,647,648,650,652,654,656,658],{"class":216,"line":336},[214,649,459],{"class":387},[214,651,229],{"class":228},[214,653,522],{"class":387},[214,655,229],{"class":228},[214,657,527],{"class":317},[214,659,530],{"class":228},[661,662,663],"tip",{},[181,664,665,666,669,670,229],{},"A tracked entity can make a read return the object from setup without exercising a database round trip. When the test is meant to check persisted rows, call ",[185,667,668],{},"_db.ChangeTracker.Clear()"," after ",[185,671,672],{},"BuildAsync()",[176,674,676],{"id":675},"what-the-store-does","What the store does",[678,679,680,687],"ol",{},[681,682,683,686],"li",{},[185,684,685],{},"db.AddRange(entities)"," in the order Biome supplies.",[681,688,689,690,692],{},"One ",[185,691,643],{},", honoring the cancellation token.",[181,694,695,696,229],{},"EF Core sorts inserts by foreign-key dependency, so the order matters less than the ",[426,697,698],{},"keys",[176,700,702],{"id":701},"database-generated-keys","Database-generated keys",[181,704,705],{},"A database-generated key is not available while the child blueprint runs. Set the navigation property to the parent instead of copying its current key. EF Core uses that relationship to fix up foreign keys when the generated values become available.",[202,707,711],{"className":204,"code":708,"filename":709,"highlights":710,"language":209,"meta":210,"style":210},"internal static readonly ChildBlueprint\u003C\n    ReviewSeed,\n    CodeRepository,\n    PullRequestRecord\n> PullRequest = Blueprint\n    .ChildOf\u003CReviewSeed, CodeRepository, PullRequestRecord>(\n        (repo, ctx) => new() { Repository = repo, CreatedAt = ctx.Now }\n    )\n    .Derive(pr => pr.Number, Numbers)\n    .Derive(pr => pr.Title, (pr, _) => $\"PR {pr.Number}\");\n","Reviews\u002FBlueprints.cs",[324],[185,712,713,729,734,739,744,757,782,833,838,866],{"__ignoreMap":210},[214,714,715,718,720,723,726],{"class":216,"line":217},[214,716,717],{"class":267},"internal",[214,719,271],{"class":267},[214,721,722],{"class":267}," readonly",[214,724,725],{"class":387}," ChildBlueprint",[214,727,728],{"class":361},"\u003C\n",[214,730,731],{"class":216,"line":238},[214,732,733],{"class":387},"    ReviewSeed,\n",[214,735,736],{"class":216,"line":257},[214,737,738],{"class":387},"    CodeRepository,\n",[214,740,741],{"class":216,"line":264},[214,742,743],{"class":387},"    PullRequestRecord\n",[214,745,746,748,751,754],{"class":216,"line":285},[214,747,314],{"class":361},[214,749,750],{"class":387}," PullRequest ",[214,752,753],{"class":361},"=",[214,755,756],{"class":387}," Blueprint\n",[214,758,759,761,764,766,769,771,774,776,779],{"class":216,"line":291},[214,760,451],{"class":228},[214,762,763],{"class":317},"ChildOf",[214,765,302],{"class":228},[214,767,768],{"class":281},"ReviewSeed",[214,770,308],{"class":228},[214,772,773],{"class":281}," CodeRepository",[214,775,308],{"class":228},[214,777,778],{"class":281}," PullRequestRecord",[214,780,781],{"class":228},">(\n",[214,783,785,788,790,792,795,798,800,803,806,809,812,814,817,819,822,824,826,828,831],{"class":784,"line":324},[216,370],[214,786,787],{"class":228},"        (",[214,789,615],{"class":281},[214,791,308],{"class":228},[214,793,794],{"class":281}," ctx",[214,796,797],{"class":228},")",[214,799,376],{"class":361},[214,801,802],{"class":361}," new",[214,804,805],{"class":228},"()",[214,807,808],{"class":228}," {",[214,810,811],{"class":387}," Repository ",[214,813,753],{"class":361},[214,815,816],{"class":387}," repo",[214,818,308],{"class":228},[214,820,821],{"class":387}," CreatedAt ",[214,823,753],{"class":361},[214,825,794],{"class":387},[214,827,229],{"class":228},[214,829,830],{"class":387},"Now ",[214,832,414],{"class":228},[214,834,835],{"class":216,"line":336},[214,836,837],{"class":228},"    )\n",[214,839,840,842,845,847,850,852,854,856,859,861,864],{"class":216,"line":349},[214,841,451],{"class":228},[214,843,844],{"class":317},"Derive",[214,846,381],{"class":228},[214,848,849],{"class":281},"pr",[214,851,376],{"class":361},[214,853,620],{"class":387},[214,855,229],{"class":228},[214,857,858],{"class":387},"Number",[214,860,308],{"class":228},[214,862,863],{"class":387}," Numbers",[214,865,472],{"class":228},[214,867,868,870,872,874,876,878,880,882,885,887,890,892,894,897,899,901,905,909,912,914,916,918,921,924],{"class":216,"line":208},[214,869,451],{"class":228},[214,871,844],{"class":317},[214,873,381],{"class":228},[214,875,849],{"class":281},[214,877,376],{"class":361},[214,879,620],{"class":387},[214,881,229],{"class":228},[214,883,884],{"class":387},"Title",[214,886,308],{"class":228},[214,888,889],{"class":228}," (",[214,891,849],{"class":281},[214,893,308],{"class":228},[214,895,896],{"class":281}," _",[214,898,797],{"class":228},[214,900,376],{"class":361},[214,902,904],{"class":903},"sjJ54"," $\"",[214,906,908],{"class":907},"s_sjI","PR ",[214,910,911],{"class":903},"{",[214,913,849],{"class":387},[214,915,229],{"class":903},[214,917,858],{"class":387},[214,919,920],{"class":903},"}",[214,922,923],{"class":903},"\"",[214,925,602],{"class":228},[202,927,932],{"className":204,"code":928,"filename":929,"highlights":930,"language":209,"meta":210,"style":210},"await using var db = sqlite.CreateContext();\nawait TestBiome\n    .Start(db, out var seed)\n    .AddCodeRepository(out var repo)\n    .AddPullRequests(out var prs, 2)\n    .AddCodeReviews(out var reviews, 1)\n    .BuildAsync();\n\nawait using var read = sqlite.CreateContext();\nvar savedPrs = await read\n    .PullRequests.Where(pr => pr.Repository.Id == repo.Id)\n    .ToListAsync();\n\u002F\u002F repo.Id > 0 now: the key was generated on save, and every FK was fixed up\n","EfCoreStoreTests.cs",[285,291,208,411,931],12,[185,933,934,958,964,985,1002,1027,1051,1059,1063,1084,1100,1143,1153],{"__ignoreMap":210},[214,935,936,938,942,944,946,948,951,953,956],{"class":216,"line":217},[214,937,444],{"class":361},[214,939,941],{"class":940},"sVHd0"," using",[214,943,467],{"class":277},[214,945,330],{"class":281},[214,947,362],{"class":361},[214,949,950],{"class":387}," sqlite",[214,952,229],{"class":228},[214,954,955],{"class":317},"CreateContext",[214,957,530],{"class":228},[214,959,960,962],{"class":216,"line":238},[214,961,444],{"class":361},[214,963,282],{"class":387},[214,965,966,968,970,972,975,977,979,981,983],{"class":216,"line":257},[214,967,451],{"class":228},[214,969,454],{"class":317},[214,971,381],{"class":228},[214,973,974],{"class":387},"db",[214,976,308],{"class":228},[214,978,464],{"class":267},[214,980,467],{"class":277},[214,982,344],{"class":281},[214,984,472],{"class":228},[214,986,987,989,992,994,996,998,1000],{"class":216,"line":264},[214,988,451],{"class":228},[214,990,991],{"class":317},"AddCodeRepository",[214,993,381],{"class":228},[214,995,384],{"class":267},[214,997,467],{"class":277},[214,999,816],{"class":281},[214,1001,472],{"class":228},[214,1003,1005,1007,1010,1012,1014,1016,1019,1021,1025],{"class":1004,"line":285},[216,370],[214,1006,451],{"class":228},[214,1008,1009],{"class":317},"AddPullRequests",[214,1011,381],{"class":228},[214,1013,384],{"class":267},[214,1015,467],{"class":277},[214,1017,1018],{"class":281}," prs",[214,1020,308],{"class":228},[214,1022,1024],{"class":1023},"srdBf"," 2",[214,1026,472],{"class":228},[214,1028,1030,1032,1035,1037,1039,1041,1044,1046,1049],{"class":1029,"line":291},[216,370],[214,1031,451],{"class":228},[214,1033,1034],{"class":317},"AddCodeReviews",[214,1036,381],{"class":228},[214,1038,384],{"class":267},[214,1040,467],{"class":277},[214,1042,1043],{"class":281}," reviews",[214,1045,308],{"class":228},[214,1047,1048],{"class":1023}," 1",[214,1050,472],{"class":228},[214,1052,1053,1055,1057],{"class":216,"line":324},[214,1054,451],{"class":228},[214,1056,187],{"class":317},[214,1058,530],{"class":228},[214,1060,1061],{"class":216,"line":336},[214,1062,261],{"emptyLinePlaceholder":260},[214,1064,1065,1067,1069,1071,1074,1076,1078,1080,1082],{"class":216,"line":349},[214,1066,444],{"class":361},[214,1068,941],{"class":940},[214,1070,467],{"class":277},[214,1072,1073],{"class":281}," read",[214,1075,362],{"class":361},[214,1077,950],{"class":387},[214,1079,229],{"class":228},[214,1081,955],{"class":317},[214,1083,530],{"class":228},[214,1085,1087,1089,1092,1094,1097],{"class":1086,"line":208},[216,370],[214,1088,545],{"class":277},[214,1090,1091],{"class":281}," savedPrs",[214,1093,362],{"class":361},[214,1095,1096],{"class":361}," await",[214,1098,1099],{"class":387}," read\n",[214,1101,1103,1105,1108,1110,1113,1115,1117,1119,1121,1123,1126,1128,1131,1134,1136,1138,1141],{"class":1102,"line":411},[216,370],[214,1104,451],{"class":228},[214,1106,1107],{"class":387},"PullRequests",[214,1109,229],{"class":228},[214,1111,1112],{"class":317},"Where",[214,1114,381],{"class":228},[214,1116,849],{"class":281},[214,1118,376],{"class":361},[214,1120,620],{"class":387},[214,1122,229],{"class":228},[214,1124,1125],{"class":387},"Repository",[214,1127,229],{"class":228},[214,1129,1130],{"class":387},"Id ",[214,1132,1133],{"class":361},"==",[214,1135,816],{"class":387},[214,1137,229],{"class":228},[214,1139,1140],{"class":387},"Id",[214,1142,472],{"class":228},[214,1144,1146,1148,1151],{"class":1145,"line":931},[216,370],[214,1147,451],{"class":228},[214,1149,1150],{"class":317},"ToListAsync",[214,1152,530],{"class":228},[214,1154,1156],{"class":216,"line":1155},13,[214,1157,1158],{"class":407},"\u002F\u002F repo.Id > 0 now: the key was generated on save, and every FK was fixed up\n",[1160,1161,1162],"warning",{},[181,1163,1164,1165,1168],{},"EF Core discovers entities ",[426,1166,1167],{},"reachable through navigations",". A transient entity referenced by a saved row is therefore saved with it.",[176,1170,1172],{"id":1171},"sqlite-and-postgres","SQLite and Postgres",[181,1174,1175],{},"SQLite makes it quick to check relationships, but it does not reproduce Postgres timestamp storage. The library runs the same chains on both: in-memory SQLite for relational shape, and Postgres through Testcontainers for timestamp round trips.",[431,1177,1178,1383],{},[202,1179,1183],{"className":204,"code":1180,"filename":1181,"highlights":1182,"language":209,"meta":210,"style":210},"public sealed class SqliteDb : IAsyncInitializer, IAsyncDisposable\n{\n    private readonly SqliteConnection connection = new(\"DataSource=:memory:\");\n\n    public async Task InitializeAsync()\n    {\n        await connection.OpenAsync();\n        await using var db = CreateContext();\n        await db.Database.EnsureCreatedAsync();\n    }\n\n    internal ReviewDb CreateContext() =>\n        new(new DbContextOptionsBuilder\u003CReviewDb>().UseSqlite(connection).Options);\n}\n","SQLite",[257,931,1155],[185,1184,1185,1208,1212,1241,1245,1261,1266,1280,1297,1315,1320,1324,1340,1378],{"__ignoreMap":210},[214,1186,1187,1189,1192,1194,1197,1200,1203,1205],{"class":216,"line":217},[214,1188,268],{"class":267},[214,1190,1191],{"class":267}," sealed",[214,1193,278],{"class":277},[214,1195,1196],{"class":281}," SqliteDb",[214,1198,1199],{"class":228}," :",[214,1201,1202],{"class":281}," IAsyncInitializer",[214,1204,308],{"class":228},[214,1206,1207],{"class":281}," IAsyncDisposable\n",[214,1209,1210],{"class":216,"line":238},[214,1211,288],{"class":228},[214,1213,1215,1218,1220,1223,1226,1228,1230,1232,1234,1237,1239],{"class":1214,"line":257},[216,370],[214,1216,1217],{"class":267},"    private",[214,1219,722],{"class":267},[214,1221,1222],{"class":281}," SqliteConnection",[214,1224,1225],{"class":281}," connection",[214,1227,362],{"class":361},[214,1229,802],{"class":361},[214,1231,381],{"class":228},[214,1233,923],{"class":903},[214,1235,1236],{"class":907},"DataSource=:memory:",[214,1238,923],{"class":903},[214,1240,602],{"class":228},[214,1242,1243],{"class":216,"line":264},[214,1244,261],{"emptyLinePlaceholder":260},[214,1246,1247,1249,1252,1255,1258],{"class":216,"line":285},[214,1248,294],{"class":267},[214,1250,1251],{"class":267}," async",[214,1253,1254],{"class":281}," Task",[214,1256,1257],{"class":317}," InitializeAsync",[214,1259,1260],{"class":228},"()\n",[214,1262,1263],{"class":216,"line":291},[214,1264,1265],{"class":228},"    {\n",[214,1267,1268,1271,1273,1275,1278],{"class":216,"line":324},[214,1269,1270],{"class":361},"        await",[214,1272,1225],{"class":387},[214,1274,229],{"class":228},[214,1276,1277],{"class":317},"OpenAsync",[214,1279,530],{"class":228},[214,1281,1282,1284,1286,1288,1290,1292,1295],{"class":216,"line":336},[214,1283,1270],{"class":361},[214,1285,941],{"class":940},[214,1287,467],{"class":277},[214,1289,330],{"class":281},[214,1291,362],{"class":361},[214,1293,1294],{"class":317}," CreateContext",[214,1296,530],{"class":228},[214,1298,1299,1301,1303,1305,1308,1310,1313],{"class":216,"line":349},[214,1300,1270],{"class":361},[214,1302,330],{"class":387},[214,1304,229],{"class":228},[214,1306,1307],{"class":387},"Database",[214,1309,229],{"class":228},[214,1311,1312],{"class":317},"EnsureCreatedAsync",[214,1314,530],{"class":228},[214,1316,1317],{"class":216,"line":208},[214,1318,1319],{"class":228},"    }\n",[214,1321,1322],{"class":216,"line":411},[214,1323,261],{"emptyLinePlaceholder":260},[214,1325,1327,1330,1333,1335,1337],{"class":1326,"line":931},[216,370],[214,1328,1329],{"class":267},"    internal",[214,1331,1332],{"class":281}," ReviewDb",[214,1334,1294],{"class":317},[214,1336,805],{"class":228},[214,1338,1339],{"class":361}," =>\n",[214,1341,1343,1346,1348,1351,1354,1356,1359,1362,1365,1367,1370,1373,1376],{"class":1342,"line":1155},[216,370],[214,1344,1345],{"class":361},"        new",[214,1347,381],{"class":228},[214,1349,1350],{"class":361},"new",[214,1352,1353],{"class":281}," DbContextOptionsBuilder",[214,1355,302],{"class":228},[214,1357,1358],{"class":281},"ReviewDb",[214,1360,1361],{"class":228},">().",[214,1363,1364],{"class":317},"UseSqlite",[214,1366,381],{"class":228},[214,1368,1369],{"class":387},"connection",[214,1371,1372],{"class":228},").",[214,1374,1375],{"class":387},"Options",[214,1377,602],{"class":228},[214,1379,1381],{"class":216,"line":1380},14,[214,1382,414],{"class":228},[202,1384,1393],{"className":204,"code":1385,"filename":1386,"highlights":1387,"language":209,"meta":210,"style":210},"public sealed class PostgresFixture : IAsyncInitializer, IAsyncDisposable\n{\n    private PostgreSqlContainer? container;\n\n    public async Task InitializeAsync()\n    {\n        container = new PostgreSqlBuilder(\"postgres:17-alpine\").Build();\n        await container.StartAsync();\n        \u002F\u002F connectionString =\n        \u002F\u002F container.GetConnectionString();\n        \u002F\u002F EnsureCreatedAsync() …\n    }\n\n    internal ReviewDb CreateContext() =>\n        new(\n            new DbContextOptionsBuilder\u003CReviewDb>()\n                .UseNpgsql(connectionString)\n                .Options\n        );\n}\n","Postgres",[324,336,1380,1388,1389,1390,1391,1392],15,16,17,18,19,[185,1394,1395,1414,1418,1432,1436,1448,1452,1481,1495,1500,1505,1510,1514,1518,1531,1538,1553,1569,1577,1583],{"__ignoreMap":210},[214,1396,1397,1399,1401,1403,1406,1408,1410,1412],{"class":216,"line":217},[214,1398,268],{"class":267},[214,1400,1191],{"class":267},[214,1402,278],{"class":277},[214,1404,1405],{"class":281}," PostgresFixture",[214,1407,1199],{"class":228},[214,1409,1202],{"class":281},[214,1411,308],{"class":228},[214,1413,1207],{"class":281},[214,1415,1416],{"class":216,"line":238},[214,1417,288],{"class":228},[214,1419,1420,1422,1425,1427,1430],{"class":216,"line":257},[214,1421,1217],{"class":267},[214,1423,1424],{"class":281}," PostgreSqlContainer",[214,1426,355],{"class":228},[214,1428,1429],{"class":281}," container",[214,1431,235],{"class":228},[214,1433,1434],{"class":216,"line":264},[214,1435,261],{"emptyLinePlaceholder":260},[214,1437,1438,1440,1442,1444,1446],{"class":216,"line":285},[214,1439,294],{"class":267},[214,1441,1251],{"class":267},[214,1443,1254],{"class":281},[214,1445,1257],{"class":317},[214,1447,1260],{"class":228},[214,1449,1450],{"class":216,"line":291},[214,1451,1265],{"class":228},[214,1453,1455,1458,1460,1462,1465,1467,1469,1472,1474,1476,1479],{"class":1454,"line":324},[216,370],[214,1456,1457],{"class":387},"        container ",[214,1459,753],{"class":361},[214,1461,802],{"class":361},[214,1463,1464],{"class":281}," PostgreSqlBuilder",[214,1466,381],{"class":228},[214,1468,923],{"class":903},[214,1470,1471],{"class":907},"postgres:17-alpine",[214,1473,923],{"class":903},[214,1475,1372],{"class":228},[214,1477,1478],{"class":317},"Build",[214,1480,530],{"class":228},[214,1482,1484,1486,1488,1490,1493],{"class":1483,"line":336},[216,370],[214,1485,1270],{"class":361},[214,1487,1429],{"class":387},[214,1489,229],{"class":228},[214,1491,1492],{"class":317},"StartAsync",[214,1494,530],{"class":228},[214,1496,1497],{"class":216,"line":349},[214,1498,1499],{"class":407},"        \u002F\u002F connectionString =\n",[214,1501,1502],{"class":216,"line":208},[214,1503,1504],{"class":407},"        \u002F\u002F container.GetConnectionString();\n",[214,1506,1507],{"class":216,"line":411},[214,1508,1509],{"class":407},"        \u002F\u002F EnsureCreatedAsync() …\n",[214,1511,1512],{"class":216,"line":931},[214,1513,1319],{"class":228},[214,1515,1516],{"class":216,"line":1155},[214,1517,261],{"emptyLinePlaceholder":260},[214,1519,1521,1523,1525,1527,1529],{"class":1520,"line":1380},[216,370],[214,1522,1329],{"class":267},[214,1524,1332],{"class":281},[214,1526,1294],{"class":317},[214,1528,805],{"class":228},[214,1530,1339],{"class":361},[214,1532,1534,1536],{"class":1533,"line":1388},[216,370],[214,1535,1345],{"class":361},[214,1537,321],{"class":228},[214,1539,1541,1544,1546,1548,1550],{"class":1540,"line":1389},[216,370],[214,1542,1543],{"class":361},"            new",[214,1545,1353],{"class":281},[214,1547,302],{"class":228},[214,1549,1358],{"class":281},[214,1551,1552],{"class":228},">()\n",[214,1554,1556,1559,1562,1564,1567],{"class":1555,"line":1390},[216,370],[214,1557,1558],{"class":228},"                .",[214,1560,1561],{"class":317},"UseNpgsql",[214,1563,381],{"class":228},[214,1565,1566],{"class":387},"connectionString",[214,1568,472],{"class":228},[214,1570,1572,1574],{"class":1571,"line":1391},[216,370],[214,1573,1558],{"class":228},[214,1575,1576],{"class":387},"Options\n",[214,1578,1580],{"class":1579,"line":1392},[216,370],[214,1581,1582],{"class":228},"        );\n",[214,1584,1586],{"class":216,"line":1585},20,[214,1587,414],{"class":228},[176,1589,1591],{"id":1590},"rows-seen-by-the-database","Rows seen by the database",[181,1593,1594,1595,1598],{},"Seed rows, aggregate parts and ",[185,1596,1597],{},"BeforeSave"," rows are all saved. Transient entities are not (unless referenced, as above).",[202,1600,1603],{"className":204,"code":1601,"filename":929,"highlights":1602,"language":209,"meta":210,"style":210},"await using var db = sqlite.CreateContext();\nawait TestBiome\n    .Start(db, out _)\n    .AddCodeRepository(out var repo)\n    .AddPullRequest(out var kept)\n    .Under(repo)\n    .AddPullRequest(out var draft)\n    .Transient()\n    .BuildAsync();\n\n\u002F\u002F draft.Id == 0: never saved; the database holds only `kept`\n",[324,336],[185,1604,1605,1625,1631,1649,1665,1683,1696,1714,1724,1732,1736],{"__ignoreMap":210},[214,1606,1607,1609,1611,1613,1615,1617,1619,1621,1623],{"class":216,"line":217},[214,1608,444],{"class":361},[214,1610,941],{"class":940},[214,1612,467],{"class":277},[214,1614,330],{"class":281},[214,1616,362],{"class":361},[214,1618,950],{"class":387},[214,1620,229],{"class":228},[214,1622,955],{"class":317},[214,1624,530],{"class":228},[214,1626,1627,1629],{"class":216,"line":238},[214,1628,444],{"class":361},[214,1630,282],{"class":387},[214,1632,1633,1635,1637,1639,1641,1643,1645,1647],{"class":216,"line":257},[214,1634,451],{"class":228},[214,1636,454],{"class":317},[214,1638,381],{"class":228},[214,1640,974],{"class":387},[214,1642,308],{"class":228},[214,1644,464],{"class":267},[214,1646,896],{"class":387},[214,1648,472],{"class":228},[214,1650,1651,1653,1655,1657,1659,1661,1663],{"class":216,"line":264},[214,1652,451],{"class":228},[214,1654,991],{"class":317},[214,1656,381],{"class":228},[214,1658,384],{"class":267},[214,1660,467],{"class":277},[214,1662,816],{"class":281},[214,1664,472],{"class":228},[214,1666,1667,1669,1672,1674,1676,1678,1681],{"class":216,"line":285},[214,1668,451],{"class":228},[214,1670,1671],{"class":317},"AddPullRequest",[214,1673,381],{"class":228},[214,1675,384],{"class":267},[214,1677,467],{"class":277},[214,1679,1680],{"class":281}," kept",[214,1682,472],{"class":228},[214,1684,1685,1687,1690,1692,1694],{"class":216,"line":291},[214,1686,451],{"class":228},[214,1688,1689],{"class":317},"Under",[214,1691,381],{"class":228},[214,1693,615],{"class":387},[214,1695,472],{"class":228},[214,1697,1699,1701,1703,1705,1707,1709,1712],{"class":1698,"line":324},[216,370],[214,1700,451],{"class":228},[214,1702,1671],{"class":317},[214,1704,381],{"class":228},[214,1706,384],{"class":267},[214,1708,467],{"class":277},[214,1710,1711],{"class":281}," draft",[214,1713,472],{"class":228},[214,1715,1717,1719,1722],{"class":1716,"line":336},[216,370],[214,1718,451],{"class":228},[214,1720,1721],{"class":317},"Transient",[214,1723,1260],{"class":228},[214,1725,1726,1728,1730],{"class":216,"line":349},[214,1727,451],{"class":228},[214,1729,187],{"class":317},[214,1731,530],{"class":228},[214,1733,1734],{"class":216,"line":208},[214,1735,261],{"emptyLinePlaceholder":260},[214,1737,1738],{"class":216,"line":411},[214,1739,1740],{"class":407},"\u002F\u002F draft.Id == 0: never saved; the database holds only `kept`\n",[176,1742,1744],{"id":1743},"other-databases","Other databases",[181,1746,1747,1748,1750],{},"Anything else implements ",[185,1749,191],{},", a single method:",[202,1752,1756],{"className":204,"code":1753,"filename":1754,"highlights":1755,"language":209,"meta":210,"style":210},"public sealed class MyStore : IBiomeStore\n{\n    public ValueTask SaveAsync(\n        IReadOnlyList\u003Cobject> entities,\n        CancellationToken cancellationToken\n    )\n    {\n        \u002F\u002F entities: aggregates expanded, transients dropped, duplicates removed,\n        \u002F\u002F BeforeSave already applied\n        return ValueTask.CompletedTask;\n    }\n}\n","MyStore.cs",[257,264,285,291],[185,1757,1758,1774,1778,1791,1809,1818,1823,1827,1832,1837,1851,1855],{"__ignoreMap":210},[214,1759,1760,1762,1764,1766,1769,1771],{"class":216,"line":217},[214,1761,268],{"class":267},[214,1763,1191],{"class":267},[214,1765,278],{"class":277},[214,1767,1768],{"class":281}," MyStore",[214,1770,1199],{"class":228},[214,1772,1773],{"class":281}," IBiomeStore\n",[214,1775,1776],{"class":216,"line":238},[214,1777,288],{"class":228},[214,1779,1781,1783,1786,1789],{"class":1780,"line":257},[216,370],[214,1782,294],{"class":267},[214,1784,1785],{"class":281}," ValueTask",[214,1787,1788],{"class":317}," SaveAsync",[214,1790,321],{"class":228},[214,1792,1794,1797,1799,1802,1804,1807],{"class":1793,"line":264},[216,370],[214,1795,1796],{"class":281},"        IReadOnlyList",[214,1798,302],{"class":228},[214,1800,1801],{"class":361},"object",[214,1803,314],{"class":228},[214,1805,1806],{"class":281}," entities",[214,1808,333],{"class":228},[214,1810,1812,1815],{"class":1811,"line":285},[216,370],[214,1813,1814],{"class":281},"        CancellationToken",[214,1816,1817],{"class":281}," cancellationToken\n",[214,1819,1821],{"class":1820,"line":291},[216,370],[214,1822,837],{"class":228},[214,1824,1825],{"class":216,"line":324},[214,1826,1265],{"class":228},[214,1828,1829],{"class":216,"line":336},[214,1830,1831],{"class":407},"        \u002F\u002F entities: aggregates expanded, transients dropped, duplicates removed,\n",[214,1833,1834],{"class":216,"line":349},[214,1835,1836],{"class":407},"        \u002F\u002F BeforeSave already applied\n",[214,1838,1839,1842,1844,1846,1849],{"class":216,"line":208},[214,1840,1841],{"class":940},"        return",[214,1843,1785],{"class":387},[214,1845,229],{"class":228},[214,1847,1848],{"class":387},"CompletedTask",[214,1850,235],{"class":228},[214,1852,1853],{"class":216,"line":411},[214,1854,1319],{"class":228},[214,1856,1857],{"class":216,"line":931},[214,1858,414],{"class":228},[1860,1861,1862],"style",{},"html pre.shiki code .sw1J6, html code.shiki .sw1J6{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sfCm-, html code.shiki .sfCm-{--shiki-light:#90A4AE;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sG8yY, html code.shiki .sG8yY{--shiki-light:#E2931D;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":210,"searchDepth":217,"depth":238,"links":1864},[1865,1866,1867,1868,1869,1870],{"id":178,"depth":238,"text":179},{"id":675,"depth":238,"text":676},{"id":701,"depth":238,"text":702},{"id":1171,"depth":238,"text":1172},{"id":1590,"depth":238,"text":1591},{"id":1743,"depth":238,"text":1744},"Save a biome through a DbContext with one SaveChangesAsync.","md",null,{},{"icon":88},{"title":85,"description":1871},"lNTw54_94dw0C7ehUkxz6-tTV2tDBIP2UzwBr9GaSVc",[1879,1881],{"title":80,"path":81,"stem":82,"description":1880,"icon":83,"children":-1},"Fill unset properties on every matching entity, and see or change the final row list before it is saved.",{"title":90,"path":91,"stem":92,"description":1882,"icon":93,"children":-1},"Use Biome without a store, for pure unit tests.",1791831052507]