⭐️ Furion v4 版本支持【所有历史版本】无缝升级,一套代码兼容 .NET 5+ ⭐️
Skip to main content

9.5 新增操作

Furion 框架提供非常多的语法糖进行数据库操作。

9.5.1 新增一条,无返回值

var user = new User { Name = "百小僧", Age = 27 };// ==== 同步操作 ====// 示例一repository.Insert(user);// 示例二user.Insert();// 示例三repository.Entities.Add(user);// 示例四repository.ChangeEntityState(user, EntityState.Added);// ==== 异步操作 ====// 示例一await repository.InsertAsync(user);// 示例二await user.InsertAsync();// 示例三await repository.Entities.AddAsync(user);

9.5.2 新增一条,返回最新数据

// ==== 同步操作 ====// 示例一var newEntity = repository.InsertNow(user);// 示例三var newEntity = user.InsertNow();// ==== 异步操作 ====// 示例二var newEntity = await repository.InsertNowAsync(user); // 有三个重载// 示例四var newEntity = await user.InsertNowAsync();  // 有三个重载

9.5.3 新增多条(不立即提交)

// ==== 同步操作 ====// 示例一repository.Insert(user, user2);// 示例二repository.Insert(new List<User> { user, user2 });// 示例三repository.Insert(new[] {user, user2 });// ==== 异步操作 ====// 示例一await repository.InsertAsync(user, user2);// 示例二await repository.InsertAsync(new List<User> { user, user2 });// 示例三await repository.InsertAsync(new[] {user, user2 });

9.5.4 新增多条(立即提交)

// ==== 同步操作 ====// 示例一repository.InsertNow(user, user2);// 示例二repository.InsertNow(new List<User> { user, user2 });// 示例三repository.InsertNow(new[] {user, user2 });// ==== 异步操作 ====// 示例一await repository.InsertNowAsync(user, user2);// 示例二await repository.InsertNowAsync(new List<User> { user, user2 });// 示例三await repository.InsertNowAsync(new[] {user, user2 });
小知识

所有带 Now 结尾的表示立即提交到数据库,也就是立即调用 SaveChangesSaveChangesAsync

9.5.5 忽略空值新增

默认情况下,EFCore 新增会插入全部列(除实体跟踪方式以外),有些时候我们希望 Null 值无需插入,这是我们只需要在更新时候配置 ignoreNullValues 参数即可,如:

repository.Insert(entity, ignoreNullValues: true);

也可以全局配置,在 AppDbContext 的派生类的构造函数中启用即可:

using Furion.DatabaseAccessor;using Microsoft.EntityFrameworkCore;namespace Furion.EntityFramework.Core{    [AppDbContext("Sqlite3ConnectionString", DbProvider.Sqlite)]    public class DefaultDbContext : AppDbContext<DefaultDbContext>    {        public DefaultDbContext(DbContextOptions<DefaultDbContext> options) : base(options)        {            InsertOrUpdateIgnoreNullValues = true;        }    }}

9.5.6 表带触发器异常解决

在某些情况下,数据库表存在触发器,这时候调用带 Now 方法会出现下列异常:

Microsoft.EntityFrameworkCore.DbUpdateException:    Could not save changes because the target table has database triggers.    Please configure your entity type accordingly,    see https://aka.ms/efcore-docs-sqlserver-save-changes-and-triggers for more information.

这时我们只需要添加 HasTrigger 即可,如:

public void Configure(EntityTypeBuilder<YourEntity> entityBuilder, DbContext dbContext, Type dbContextLocator){    entityBuilder.ToTable(tb => tb.HasTrigger("TriggerName")); // 标记数据库表存在触发器,触发器名称可随意}

相关 Issue https://gitee.com/dotnetchina/Furion/issues/I5S4EC

9.5.7 反馈与建议

与我们交流

给 Furion 提 Issue

演练场