8.6K Star 14.2K Fork 4.2K

GVPdotNET China/Furion

 / 详情

insert时爆Unknown column 'Discriminator' in 'field list'

已完成
创建于  
2021-03-12 10:11

特别说明:如果 Issue 报告为问题且开发成员回复确认问题之后但三天内都不能得到反馈,则视为无效Issue。

Furion 版本号

1.15.0


Web 项目类型

  • WebApi
  • Mvc
  • Razor Pages
  • Blazor Server

描述你的问题

在执行insert的时候爆Unknown column 'Discriminator' in 'field list',
看日志是多插了一个Discriminator字段,但是全局搜索关键字都搜不到这个词,
我是DB First。


异常堆栈信息

Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details.
---> MySqlConnector.MySqlException (0x80004005): Unknown column 'Discriminator' in 'field list'
---> MySqlConnector.MySqlException (0x80004005): Unknown column 'Discriminator' in 'field list'
at MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in //src/MySqlConnector/Core/ResultSet.cs:line 49
at MySqlConnector.MySqlDataReader.ActivateResultSet(CancellationToken cancellationToken) in /
/src/MySqlConnector/MySqlDataReader.cs:line 131
at MySqlConnector.MySqlDataReader.CreateAsync(CommandListPosition commandListPosition, ICommandPayloadCreator payloadCreator, IDictionary2 cachedProcedures, IMySqlCommand command, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlDataReader.cs:line 436 at MySqlConnector.Core.CommandExecutor.ExecuteReaderAsync(IReadOnlyList1 commands, ICommandPayloadCreator payloadCreator, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in //src/MySqlConnector/Core/CommandExecutor.cs:line 60
at MySqlConnector.MySqlCommand.ExecuteReaderAsync(CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in /
/src/MySqlConnector/MySqlCommand.cs:line 310
at MySqlConnector.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior) in /_/src/MySqlConnector/MySqlCommand.cs:line 255
at System.Data.Common.DbCommand.ExecuteReader()
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
--- End of inner exception stack trace ---
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable1 commandBatches, IRelationalConnection connection) at Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IList1 entries)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IList1 entriesToSave) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(DbContext _, Boolean acceptAllChangesOnSuccess) at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.Execute[TState,TResult](TState state, Func3 operation, Func3 verifySucceeded) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess) at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess) at Microsoft.EntityFrameworkCore.DbContext.SaveChanges() at Furion.DatabaseAccessor.DbContextPool.<>c.<SavePoolNow>b__6_1(DbContext u) at System.Linq.Enumerable.WhereSelectEnumerableIterator2.GetCount(Boolean onlyIfCheap)
at System.Linq.Enumerable.Count[TSource](IEnumerable`1 source)
at Furion.DatabaseAccessor.DbContextPool.SavePoolNow()
at Furion.DatabaseAccessor.UnitOfWorkFilter.OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)

附sql

INSERT INTO `vm_materials_pickinfo` (`barcode`, `corp_name`, `corp_sn`, `cost_center`, `Discriminator`, `loc_sn`, `mach_name`, `mach_sn`, `mat_brand`, `mat_brand_name`, `mat_cat`, `mat_is_old`, `mat_life_plan`, `mat_model`, `mat_name`, `mat_need_back`, `mat_packing_name`, `mat_packing_unit_name`, `mat_pic`, `mat_qty_unit_pack`, `mat_sn`, `mat_use_for_id`, `mp_mr_sn`, `pdt_name`, `pdt_op_name`, `pdt_op_sn`, `pdt_sn`, `picking_qty`, `pk_domain`, `pk_rdorder_sn`, `pk_return_time`, `pk_sn`, `pk_sync_info`, `pk_sync_time`, `pk_time`, `pk_u_costcenter`, `pk_u_pick_type`, `plicking_list_sn`, `supplier_name`, `supplier_sn`, `user_name`, `user_sn`, `vm_sn`)
VALUES ('', '', 'WHEAT', '', 'VmMaterialsPickinfo', '1', '', '', '', '', '', 0, 0, 'test001fff', 'test001', 0, '盒', '片', '/goods/2020-07/20200716200527.jpg', 9, 'test005', null, '', '', '', '', '', 9, '1', '', '', 'PK-VM01-20210312092656', '', '', '2021-03-12T09:26:56', '', null, '', '', 'HaiHong', '555', '5555', 'VM01');
SELECT `pk_id`, `mat_life_rest`, `mat_life_used`, `mp_mat_quota_consumption`, `mp_MPS_qty`, `mp_mr_project_sn`, `pk_cw_mblnr_sn`, `pk_cw_po_sn`, `pk_cw_receipt_sn`, `pk_mat_price`, `pk_mat_price_sum`, `pk_mat_res1`, `pk_mat_res2`, `pk_mat_res3`, `pk_mat_res4`, `pk_mat_res5`, `pk_qr_code`, `pk_return_mat_type`, `pk_return_sn`, `pk_synced`
FROM `vm_materials_pickinfo`
WHERE ROW_COUNT() = 1 AND `pk_id` = LAST_INSERT_ID();

代码或代码仓库

 [UnitOfWork]
        private void SaveMaterialPickingInfo(PickingInfoDto pickingInfo, VmStock stock)
        {
            pickingInfo.PickingQty *= pickingInfo.MatQtyUnitPack;
            pickingInfo.MatIsOld = stock.LocMatQtyOld > 0;
            var dbPickingInfo = _mapper.Map<VmMaterialsPickinfo>(pickingInfo);
            _materialPickInfoRepository.Insert(dbPickingInfo); //插入出库信息
            stock.LocMatQtyNew -= pickingInfo.PickingQty; 
            _stockRepository.Update(stock);//更新库存信息
            var keep = _stockKeepRepository.SingleOrDefault(s =>
                s.SukUserSn == pickingInfo.UserSn && s.SukMatSn == pickingInfo.MatSn) ?? new VmStockKeep
            {
                SukUserSn = pickingInfo.UserSn,
                SukMatSn = pickingInfo.MatSn,
                SukMatQty = 0
            };
            keep.SukMatQty += pickingInfo.PickingQty;
            _stockKeepRepository.InsertOrUpdate(keep);//更新个人库存信息(非一次性用品,每个人手上有多少)
        }

数据库信息

  • Sqlite
  • SqlServer
  • Mysql
  • Oracle
  • PGSql
  • Firebird
  • Cosmos

期待结果

解决报错


评论 (6)

肖骁 创建了任务 4年前
肖骁 关联仓库设置为dotNET China/Furion 4年前
展开全部操作日志

这个问题是 EFCore 提示的,和 Furion 框架本身无关。出现这个问题一般是你的实体类继承了非抽象类,而且这个非抽象类也是一个表,通俗点说,就是表继承了表导致的。可以仔细审查一下。

我这个是用furion的DB First反向生成的,不存在实体类继承另一个表的情况。

  public partial class VmMaterialsPickinfo : IEntity<MasterDbContextLocator>, IEntityTypeBuilder<VmMaterialsPickinfo, MasterDbContextLocator>
    {

用了个我不想用的方法解了。
我之前是创了个dto继承实体类,在controller那边先拼装dto,当要入库时才通过映射转换成实体类。此时就会爆Unknown column 'Discriminator' in 'field list'。
现在我取消继承关系,直接把实体类的字段考到dto里面,这样insert的时候就不爆错。
我觉得是不是可以改良下catch这个错误

这个是EFCore的机制,Furion 只做拓展,无法改进微软底层的机制。

目前这个问题已经解决了吗?解决了我关闭Issue哦。

百小僧 负责人设置为百小僧 4年前
百小僧 添加了
 
疑问
标签
4年前
百小僧 里程碑设置为Furion 2021 4年前
百小僧 关联分支设置为master 4年前
百小僧 计划截止日期设置为2021-03-13 4年前
百小僧 计划开始日期设置为2021-03-12 4年前
百小僧 计划截止日期2021-03-13 修改为2021-03-12 4年前

产生这个的原因就继承导致。EF会自动加入Discriminator字段,如果你是DbFirst 你要在那张表上增加Discriminator 为字符的字符串。

百小僧 任务状态待办的 修改为进行中 4年前
百小僧 通过 dotnetchina/Furion Commit d823f2b任务状态进行中 修改为已完成 4年前
百小僧 关联分支master 修改为未关联 2年前

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(3)
974299 monksoul 1578937227 805126 shawnshowxiao 1644564422 81568 gordo 1578916720
C#
1
https://gitee.com/dotnetchina/Furion.git
git@gitee.com:dotnetchina/Furion.git
dotnetchina
Furion
Furion

搜索帮助