夸克之书

  • 首页
  • 科普
  • 笔记
  • .NET/C#
  • 物联网
  • 算法
  • Linux
  • 树莓派
夸克之内,别有洞天
  1. 首页
  2. 默认
  3. 正文

.NET Core Mysql EF主键自增

2019-06-22 10386点热度 1人点赞 0条评论

这篇文章为.NET Core Mysql EF主键只增踩坑记录。在 .NET Core Mysql EF 走的路越多,遇到的坑就愈多。

按照Framework管理,先创建一个Entity。

[Table("Device_SetUpdateLog")]
public class DeviceSetUpdateLog
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    [Required]
    [MaxLength(200)]
    public string Name { get; set; }

    [MaxLength(100)]
    public string Date { get; set; }

    public int CreateTime { get; set; }
}

然后在DbContent中添加DbSet。

按道理,应该就没问题了。如果在EntityFramework下,那确实是没问题的,能够正常写入数据并设置主键自增。但是如果是跑在EntityFrameworkCore,恭喜,喜获一个错误:

%title插图%num

错误堆栈:

System.Exception: Init db data failed, error is An error occurred while updating the entries. See the inner exception for details. ---> Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.MissingFieldException: Field not found: 'Microsoft.EntityFrameworkCore.Metadata.Internal.EntityMaterializerSource.ThrowReadValueExceptionMethod'.
   at Microsoft.EntityFrameworkCore.Storage.TypedRelationalValueBufferFactoryFactory.CreateGetValueExpression(Expression dataReaderExpression, Expression indexExpression, TypeMaterializationInfo materializationInfo, Boolean box)
   at System.Linq.Enumerable.SelectIterator[TSource,TResult](IEnumerable1 source, Func3 selector)+MoveNext()
   at System.Collections.Generic.LargeArrayBuilder1.AddRange(IEnumerable1 items)
   at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at System.Dynamic.Utils.CollectionExtensions.ToReadOnly[T](IEnumerable`1 enumerable)
   at System.Linq.Expressions.Expression.NewArrayInit(Type type, IEnumerable`1 initializers)
   at Microsoft.EntityFrameworkCore.Storage.TypedRelationalValueBufferFactoryFactory.CreateArrayInitializer(CacheKey cacheKey)
   at Microsoft.EntityFrameworkCore.Storage.TypedRelationalValueBufferFactoryFactory.<Create>b__10_0(CacheKey k)
   at System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd(TKey key, Func2 valueFactory)
   at Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ConsumeResultSetWithPropagation(Int32 commandIndex, RelationalDataReader reader)
   at Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.Consume(RelationalDataReader reader)
   --- End of inner exception stack trace ---
   at Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.Consume(RelationalDataReader reader)
   at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(DbContext _, ValueTuple`2 parameters)
   at Microsoft.EntityFrameworkCore.Storage.Internal.NoopExecutionStrategy.Execute[TState,TResult](TState state, Func3 operation, Func3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable`1 commandBatches, IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList`1 entriesToSave)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess)
   at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
   at Common.Data.Entity.ELDbDataInitializer.Initialize() in C:UserssysrusourcereposeftestCommon.Data.EntityELDbDataInitializer.cs:line 75
   --- End of inner exception stack trace ---
   at eftest.Program.Main(String[] args) in C:UserssysrusourcereposeftesteftestProgram.cs:line 29

分析这个错误信息也是死活找不出错在上面地方。

再仔细一看,关键词“Field not found”,而我插入的数据是这样的:

new DeviceSetUpdateLog()
{
    Name = "设备发现",
    Date = "2018/02/07",
    CreateTime = nowUnixTime,
}

少了一个ID字段,因为ID字段设置了只增,写入数据后会自动设置,按道理是不用管的。但是鉴于此处出现了错误,我就手动指定了ID,现在插入的数据是这样的。

new DeviceSetUpdateLog()
{
    ID = 1,
    Name = "设备发现",
    Date = "2018/02/07",
    CreateTime = nowUnixTime,
}

hi,数据居然写进去了,也没有出现错误。至此算是搞明白问题出在什么位置了。

但是那么多表主键都是自增的,而且不可以单独编写ID自增的代码呀(也不是不可以,实在没有办法的情况下)。

然后就用关键词Identity搜索Nuget,或许有小惊喜哦。没想到还真让我找到了。包“Microsoft.AspNetCore.Identity.EntityFrameworkCore”

%title插图%num

抱着司马当活马医的想法安装好。成了,在不指定ID值的情况下,可以插入数据。

本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2020-12-13

afirefish

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论
放松一下
https://www.quarkbook.com/wp-content/uploads/2021/05/凤凰传奇-海底(Live).flac
分类
  • .NET/C#
  • Linux
  • 树莓派
  • 物联网
  • 科普
  • 笔记
  • 算法
  • 默认
最新 热点 随机
最新 热点 随机
在代码中判断龙芯新旧世界平台 Windows获取固定后缀的IPv6地址 目前为止,你可能找不到第二台支持志强的1L小主机(P350 Tiny+W-1350+ECC+双NVME+PCIE扩展)!!! iKuai(爱快)实现成都移动IPTV IPoE拨号 Linux EXT4分区误删除后数据恢复 C#连接到巴法云
在代码中判断龙芯新旧世界平台
Windows移除多余输入法'Unknown Locale (qaa-Latn)' C#连接到巴法云 在VS Code开发Arduino项目 ESXi 6.7U3离线驱动封装 树莓派4B配置U盘启动 Ubuntu18.04下Mysql8.0.15关闭大小写敏感
最近评论
Eagle 发布于 7 个月前(10月21日) 参考博主教程成功搞定了成都移动IPTV组播转单播,电脑、手机都可以播放了。但目前有个问题,原IPTV...
rundoze 发布于 9 个月前(08月31日) 牛逼
cc21216695 发布于 2 年前(09月27日) 试了一下,加入启动项也无效,压根没有用
afirefish 发布于 3 年前(11月28日) 非常感谢,非常棒!
》随缘《 发布于 3 年前(11月20日) 最新【一键处理】方法: https://github.com/MrXhh/VSTools/rele...
书签
  • 打赏
  • 毒鸡汤
  • 米店
  • 金鱼直播间

COPYRIGHT © 2023 quarkbook.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

蜀ICP备15036129号-9

登录
注册|忘记密码?