Herdr UI
Herdr의 TUI가 뛰어나며, 창을 통해 추가되는 기능
EntityFrameworkCore provider for multitier applications. Eliminates the need to handcraft custom CRUD and query APIs for client-server apps by letting your client frontend interact with a standard DbContext.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
InfoCarrier.Core is an Entity Framework Core provider for the client side of a multi-tier
application. Your client is a WPF, Blazor WebAssembly, MAUI or console app. It gets a real
DbContext with LINQ, change tracking, the identity map, navigation fix-up, lazy loading and
transactions, but no connection string and no database driver. Queries and units of work travel to
your application server, which executes them with an ordinary EF Core provider.
Both halves need .NET 10 and EF Core 10.README 전문 보기 ↗Documentation · Samples · Try it in Codespaces · Contributing
InfoCarrier.Core is an Entity Framework Core provider for the client side of a multi-tier
application. Your client is a WPF, Blazor WebAssembly, MAUI or console app. It gets a real
DbContext with LINQ, change tracking, the identity map, navigation fix-up, lazy loading and
transactions, but no connection string and no database driver. Queries and units of work travel to
your application server, which executes them with an ordinary EF Core provider.
# In the client project, and in the server project too.
dotnet add package InfoCarrier.Core
# In the server project only.
dotnet add package InfoCarrier.Core.AspNetCore
Both halves need .NET 10 and EF Core 10.
The DbContext and the entity classes are shared source between the client and the server, so
both halves build the same model. On the client, point the context at a transport:
// A WPF, Blazor WebAssembly, MAUI or console app.
using var http = new HttpClient();
IInfoCarrierClient client = InfoCarrierClient.Create(http, options =>
options.WithEndpoint("https://your-app-server/infocarrier"));
var options = new DbContextOptionsBuilder<ShopContext>().UseInfoCarrier(client).Options;
// Everything below this line is ordinary EF Core.
await using var context = new ShopContext(options);
List<Order> recent = await context.Orders
.Include(o => o.Customer)
.Where(o => o.Customer!.Country == "Germany" && o.Freight > 50m)
.OrderByDescending(o => o.PlacedOn)
.Take(20)
.ToListAsync();
recent[0].Freight = 0m;
await context.SaveChangesAsync();
That query is not evaluated on the client. It crosses the wire as an expression tree, and your
server runs it against SQL Server, PostgreSQL, SQLite, or whatever provider it uses. On the
server, app.MapInfoCarrier() is the endpoint that receives it.
Your first client and server builds the whole pair, and the samples run one command each.
Queries and the client/server projection split, SaveChanges including many-to-many graphs, lazy
loading, explicit loading, transactions with savepoints, ExecuteUpdate and ExecuteDelete,
complex types, JSON-mapped owned collections, spatial types, compiled models, and
Blazor WebAssembly
published trimmed.
Where the server's store is relational, the client knows it. The three inheritance mappings, table
and entity splitting, EF.Functions and your own HasDbFunction mappings all round trip, and
FromSql runs where the server grants it. See the
10.3 release notes.
An HTTP transport ships in the package. To use gRPC, a message bus, or a direct call in the same
process, write one small class. IInfoCarrierTransport has one method.
The provider runs Microsoft's own EF Core specification suite, the same suite the SQL Server, SQLite and InMemory providers run. The limitations page lists every scenario in that suite which behaves differently here, with a worked example for each. Read it before you adopt.
If you encounter a bug, have a question, or would like to request a feature, open an issue. For a vulnerability, use a draft security advisory instead, as SECURITY.md describes.
Fixes go to the 10.x line. The 1.0 to 3.1 line last shipped on 2021-05-07 and gets none.
Built on Entity Framework Core and judged by its test suite.
InfoCarrier.Core 1.0 to 3.1, by on/off it-solutions gmbh, proved the idea, and built it on Remote.Linq and aqua-core by Christof Senn. Version 10 has its own serializer and no longer depends on them.
MIT, Copyright (c) Alexander Zabluda. See license.txt.