使用Entity-Framework-Extensions BulkInsert时可空枚举引发EffortException
解决Entity Framework Extensions BulkInsert可空枚举转换问题
- 用Fluent API配置枚举映射
在DbContext的OnModelCreating方法里,强制指定枚举属性按整数类型存储,可空枚举同样适用:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<你的实体类>() .Property(e => e.MandatoryJobCommentType) .HasConversion<int>(); }
这个配置会让EF(包括EF Extensions的BulkInsert)始终用枚举对应的整数值处理,避免字符串转换问题。
- 用数据注解指定列类型
如果习惯用注解,直接在实体的枚举属性上加[Column(TypeName = "int")],前提是枚举本身基于int类型(默认就是):
public class 你的实体类 { [Column(TypeName = "int")] public MandatoryJobCommentType? MandatoryJobCommentType { get; set; } } // 枚举定义(默认int基类型,无需额外声明) public enum MandatoryJobCommentType { StateTransition = 1, // 其他枚举值 }
要是枚举不是int基类型,得显式声明,比如public enum MandatoryJobCommentType : int。
- 配置BulkInsert的列类型
可以在BulkInsert时显式指定列的类型,确保库正确转换枚举值:
var options = new BulkInsertOptions { Columns = new List<BulkColumn> { new BulkColumn(nameof(你的实体类.MandatoryJobCommentType), typeof(int?)) } }; context.BulkInsert(待插入实体列表, options);
- 调整Effort的模拟表结构
如果以上配置还是没解决,可能是Effort的模拟数据库没正确识别类型,可以手动调整表结构:
var connection = DbConnectionFactory.CreateTransient(); var context = new 你的DbContext(connection); // 手动修改列类型为可空int context.Database.ExecuteSqlRaw("ALTER TABLE 你的表名 ALTER COLUMN MandatoryJobCommentType INT NULL");
内容的提问来源于stack exchange,提问作者Alastair
相关产品推荐
相关产品推荐

