zoukankan      html  css  js  c++  java
  • 如何使EF Core不插入MySql中自增长的主键(踩坑实录)

    公司要求使用 .Net Core + EF Core + Mysql 开发项目,为了以后可以部署到Linux服务器上,实际是奇葩的客户需求。

    数据库设计时虽然大部分表的主键都采用了UUID(也就是SQL Server的GUID),好处是啥我也就不(bu)说(hui)了(shuo),大家自行百度下吧。

    而对于一些不是那么重要的表,或者说会经常产生大量数据的表,我们都是用自增长的主键,然后重点来了,在使用“Scaffold”命令生成实体类的时候,是下面这样的:

    public partial class File
        {
            public int Id { get; set; }
            public string FileName { get; set; }
            public string FileType { get; set; }
            public string FileSize { get; set; }
            public string FilePath { get; set; }
            public string ProId { get; set; }
            public string CreateUser { get; set; }
            public string CreateUserName { get; set; }
            public DateTime CreateTime { get; set; }
            public int IsDel { get; set; }
        }

    可以看到,该表的Id是Int型,也就是自增长的主键,而如果我们直接使用的话,那么在你不对主键赋值的情况下,第一次肯定是插入0,第二次就直接报错了,会提示你主键重复。

    也就是Id并没有自增,EF Core直接给主键赋值为0,并执行插入。那么怎么才能告诉EF Core我这张表的Id是自增的呢?

    经过百度,查到的答案是加特性,如下:

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

    或者

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]

    告诉EF Core它是自增的,你不要管我啦。然后你以为这样结束了?不好意思,一样报错,哈哈。正确答案是:

    public partial class File
        {
            [DatabaseGenerated(DatabaseGeneratedOption.None)]
            public int Id { get; set; }
        }

    没错应该使用“DatabaseGeneratedOption.None”的特性,官方注释是“The database does not generate values”。

    虽然不知道为啥这个最不靠谱的却是正确的,但事实如此。加上这个特性后,插入时不用对Id做任何操作,直接会自增长,多少条都能保存成功

    我也是把三个类型试了遍才发现的,写下来给大家提个醒,可以少走点弯路。

  • 相关阅读:
    linux 上安装sqlplus
    如何使用 SVN 找到一段时间内提交的代码文件
    nginx 快速检查配置文件的方法
    nginx 报错 [emerg] 1164#1664: bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)
    nginx 负载均衡
    C#可扩展编程之MEF学习
    5天玩转C#并行和多线程编程
    C#综合揭秘——深入分析委托与事件
    解析C#中[],List,Array,ArrayList的区别及应用
    在easyui datagrid中formatter数据后使用linkbutton
  • 原文地址:https://www.cnblogs.com/lxc89/p/12699628.html
Copyright © 2011-2022 走看看