9.6 新增操作
📝 模块更新日志
-
问题修复
- 实体拓展方式操作数据库出现空异常问题 4.8.5 ⏱️2023.01.28 #I6AXU6
Furion
框架提供非常多的语法糖进行数据库操作。
9.6.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.6.2 新增一条,返回最新数据
// ==== 同步操作 ====
// 示例一
var newEntity = repository.InsertNow(user);
// 示例三
var newEntity = user.InsertNow();
// ==== 异步操作 ====
// 示例二
var newEntity = await repository.InsertNowAsync(user); // 有三个重载
// 示例四
var newEntity = await user.InsertNowAsync(); // 有三个重载
9.6.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.6.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
结尾的表示立即提交到数据库,也就是立即调用 SaveChanges
或 SaveChangesAsync
。
9.6.5 忽略空值新增
默认情况下,EFCore
新增会插入全部列(除实体跟踪方式以外),有些时候我们希望 Null
值无需插入,这是我们只需要在更新时候配置 ignoreNullValues
参数即可,如:
repository.Insert(entity, ignoreNullValues: true);
注意:EFCore
还是会对 NULL
值列生成 SQL
语句。
也可以全局配置,在 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.6.6 表带触发器异常解决
在某些情况下,数据库表存在触发器,这时候可能会出现下列异常:
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.6.7 反馈与建议
与我们交流
给 Furion 提 Issue。