Skip to content

9.6 新增操作

📝 模块更新日志 问题修复*

+ 修复 实体拓展方式操作数据库出现空异常问题 4\.8\.5 ⏱️2023\.01\.28 [\#I6AXU6](https://gitee.com/dotnetchina/Furion/issues/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 结尾的表示立即提交到数据库,也就是立即调用 SaveChangesSaveChangesAsync

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