Search code examples
c#blazorblazor-webassembly.net-7.0

Blazor gets a Microsoft.Data.SqlClient error


I'm using a clear architecture for a NET7 project with Blazor. In the Persistence layer, I have a function to register the database and all the repositories

public static class PersistenceServiceRegistration
{
    public static IServiceCollection AddPersistenceServices(
        this IServiceCollection services,
        IConfiguration configuration,
        string cnnStringName = "LIUContextConnection")
    {
        var cnnString = configuration.GetConnectionString(cnnStringName);
        services.AddDbContext<LIUContext>(options =>
            options.UseSqlServer(cnnString)
        );

        services.AddScoped<IArticleRepository, ArticleRepository>();

        return services;
    }
}

So, in the Program.cs I can register the persistence like

builder.Services.AddPersistenceServices(builder.Configuration);

I want to be sure that the database is created before the application starts. I added the following code an the end of the Program.cs

var app = builder.Build();

LIUContext dbcontext = app.Services.GetRequiredService<LIUContext>();
dbcontext.Database.EnsureCreated();

await app.RunAsync();

When I run the application, I get an error because

Microsoft.Data.SqlClient is not supported on this platform

enter image description here

I added in the Client project and in the Persistence project the NuGet package but I get the some error.

If I create the database from the Package Manager Console is working.


Solution

  • "is not supported on this platform" is of course the main point.

    The platform here is dotnet in the Browser and a lot of APIs are not (cannot be) supported. The SqlClient needs sockets and they are not allowed in the browser. Also, you wouldn't be able to keep the credentials secret.

    There is some limited support for SqLite and you have the built-in IndexedDb.

    For a full SQL Db, the common approach is to use a WebService (Blazor Wasm Hosted template) to handle the Db access.