在Blazor中使用FreeSql的入门级教学
折腾了一下午,赶紧分享出来给有需要的看看,在下面的例子中,项目使用的是BootstrarpBlazor模板创建的,使用的是Server模式,对于会的人来说他不需要看这些就已经很精通了,对于初学者来说如何在blazor中使用FreeSql还是需要一个详细的教程来说明一下的。
如果你的VS2022中没有这个模版,则去bootstrapblazor网站下载,地址https://www.blazor.zone/template,下载后安装就有了。
网上关于如何在Blazor中使用ef core的例子很多,也很详细,但关于FreeSql的没找到几个,并且也不怎么友好,建议使用.net 8.0,不然blazor的写法有些不一样,在开始前先引用FreeSql包
首先注入FreeSql服务
打开你的Program.cs文件,需要在里面增加一段代码,用于注入FreeSql服务,官网上的依赖注入是这么写的。
var builder = WebApplication.CreateBuilder(args);
Func<IServiceProvider, IFreeSql> fsqlFactory = r =>
{
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=freedb.db")
.UseMonitorCommand(cmd => Console.WriteLine(#34;Sql:{cmd.CommandText}"))
.UseAutoSyncStructure(true) //自动同步实体结构到数据库,只有CRUD时才会生成表
.Build();
return fsql;
};
builder.Services.AddSingleton<IFreeSql>(fsqlFactory);
WebApplication app = builder.Build();
主要是我也不会,在使用过程中一直弄不好,就换成下面的写法了,更容易看明懂,网上说这段代码要写在builder.Services.AddBootstrapBlazor()语句之前,咱照做就行了。
IFreeSql _fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=192.168.3.111;User Id=sa;Password=密码;Initial Catalog=数据库名称;Encrypt=True;TrustServerCertificate=True;Pooling=true;Min Pool Size=1")
.Build();
builder.Services.AddSingleton<IFreeSql>(_fsql);
控制器中使用
如果你在控制器中使用FreeSql,则需要通过构造函数注入IFreeSql接口的一个实例后才能使用,在控制器中没法使用[inject]进行注入,假如你的控制器名称叫AccountController,那么就按下面代码写,在具体的方法中就可以直接使用了
[Microsoft.AspNetCore.Mvc.Route("api/[controller]/[action]")]
[ApiController]
public class AccountController : ControllerBase
{
private readonly IFreeSql fsql;
public AccountController(IFreeSql _fsql)
{
fsql = _fsql;
}
//控制器中具体的方法
}
//在具体的方法中进行使用,可以加个断点来查看t的具体值
var t = fsql.Select<UserAccout>().Where(p=>p.用户名==user.用户名 && p.密码==user.密码).ToOne();
如果是通过依赖注入的话,写的时候不会报错,但在使用的时候会报错,构造注入时则不会
在blazor组件中使用
如果你是在组件中使用,则需要先在组件页面中增加依赖注入,写在html代码前面
@inject IFreeSql fsql;
如果是界面和代码分离,在代码中这么写就行了
[Inject]IFreeSql fsql{ get; set; }
需要使用时在代码中直接使用就可以了
var t=fsql.Select<UserAccout>().ToList();
需要注意的是在组件中不支持构造注入,直接写是会报错的,正常运行后的效果如下
关于UserAccout实体类如下,在你的数据库中要有相对应的表:
public class UserAccout
{
[Key]
public int UID { get; set; }
[Required(ErrorMessage = "用户名不能为空")]
public string? 用户名 { get; set; }
[Required(ErrorMessage = "密码不能为空")]
public string? 密码 { get; set; }
public string? 姓名 { get; set; }
public DateTime? 登录日期 { get; set; }
public int? 角色ID { get; set; }
}
在调试时很难一次性成功,不要太相信热重载,直接每次重新启动就行了,不然你的有些修改可能就不起作用。