> 信息中心 >

EF Core 2.2使用Code First模式如何设置主键不自增(如何设置主键可赋值)

来源:互联网 编辑:吕秀秀

有网友碰到过这样的问题:EF Core 2.2使用Code First模式如何设置主键不自增(如何设置主键可赋值),问题详细内容为:

【环境】:.NET Core 2.2 + EF Core 2.2,使用Code First模式,实体Entity的映射没有写在Entity里,分离了出来单独配置,通过实现IEntityTypeConfiguration接口来实现映射的,具体代码如下:

实体类(EntityBase):

/// <summary>实体基类</summary> public class EntityBase { /// <summary>主键</summary> /// <value>The identifier.</value> public long Id { get; set; } /// <summary>创建人姓名</summary> /// <value>The name of the create.</value> public string CreateName { get; set; } = string.Empty; /// <summary>创建人Id</summary> /// <value>The create identifier.</value> public long? CreateId { get; set; } /// <summary>创建时间</summary> /// <value>The create time.</value> public DateTime? CreateTime { get; set; } /// <summary>更新人姓名</summary> /// <value>The name of the update.</value> public string UpdateName { get; set; } = string.Empty; /// <summary>更新人Id</summary> /// <value>The update identifier.</value> public long? UpdateId { get; set; } /// <summary>更新时间</summary> /// <value>The update time.</value> public DateTime? UpdateTime { get; set; } /// <summary>数据状态</summary> /// <value>The state of the data.</value> public bool IsDeleted { get; set; } /// <summary>基础字段设置方法</summary> /// <value>The automatic setter.</value> public IEntityBaseAutoSetter AutoSetter { get; set; } }

映射类:

/// <summary>Map实体基类的基础字段</summary> /// <typeparam name="T"></typeparam> public abstract class EntityBaseTypeConfig<T> : IEntityTypeConfiguration<T> where T : EntityBase { public virtual void Configure(EntityTypeBuilder<T> builder) { builder.HasKey(it => it.Id); builder.Property(x => x.CreateId).IsRequired(false); builder.Property(x => x.CreateName).HasMaxLength(128).IsRequired(false); builder.Property(x => x.CreateTime).IsRequired(false); builder.Property(x => x.UpdateId).IsRequired(false); builder.Property(x => x.UpdateName).HasMaxLength(128).IsRequired(false); builder.Property(x => x.UpdateTime).IsRequired(false); builder.Property(x => x.IsDeleted).IsRequired(); builder.Ignore(x => x.AutoSetter); } }

【问题】
其中Id设置了主键,在Code First生成数据库时,主键自动设置了自增长,但是框架在向表添加数据时会生成Guid赋值给主键Id,导致保存到数据库是报错,报错内容如下:

[ System.Data.SqlClient.SqlException (0x80131904): 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'Student' 中的标识列插入显式值。]

【期望】
映射的时候,如何设置主键不增长,或者说如何设置主键可赋值?
框架可以使用自己的规则生成Id作为主键存入数据库。

【补充】
在EF 6.x的版本中,可以通过继承EntityTypeConfiguration类,然后设置如下方式实现
this.Property<long>((Expression<Func<T, long>>) (x => x.Id)).IsRequired().HasDatabaseGeneratedOption(new DatabaseGeneratedOption?(DatabaseGeneratedOption.None));
但是在EF Core中我好像没有找到类似的方法

EF Core ,我搜你通过互联网收集了相关的一些解决方案,希望对有过相同或者相似问题的网友提供帮助,具体如下:

解决方案1:
试试 builder.Property(x => x.Id).ValueGeneratedNever(); 收获园豆:10
============================================
感谢,已解决。
但是同时又发现了新的问题:在修改主键字段属性的时候,EF Core会报错【更改列的IDENTITY属性,需要删除并重新创建列】,只能删掉再重新创建。
搜索后发现,在EF Core的源码下已经有人提过issue了(https://github.com/aspnet/EntityFrameworkCore/issues/7444)。
这是EF Core当前版本还没有解决的Bug?
============================================
@在7楼: 为什么不直接在数据库中修改?
============================================
@dudu: 没有针对这个问题和解决方案,主要是好奇这个是属于EF Core遗留的未解决Bug,还是以后版本也不打算解决(设计就是一旦Code First初始化主键之后就不可以修改主键属性了)?
============================================
@在7楼: 等 EF Core 3.0
解决方案2:
这是设计思维的理解不一样, 主键是一个对象标识自身不同于其它对象的方式。 如果修改主键,那么就有可能把主键的值修改成与其它对象的主键相同,那么主键本身的【唯一性】功能就尚是了,接下来还会引发更严重的事情,造成一个表中存在相同主键的多个对象。 —— 当然题主肯定是不会做这种操作的,但从编程的绝对可靠原则上,为了避免此类事件发生,所以不允许修改主键,个人观点。

EF Core什么时间来触发从数据库中执行查询

to_number(to_char(t.access_time,'yyyy-MM-dd hh24:mm:ss')) access_time, 这句话出错. 原因 假如 t.access_time = 2011年10月10日 10:00:00 那么 to_char(t.acces...

ef core使用code first无法为mysql数据表设置字段默认值,该怎么...

public void ConfigureServices(IServiceCollection services) { //这里就是填写数据库的链接字符串 var connection = "Data Source=.;Initial Catalog=EFCore;User ID=sa;Pas...

ef code first 怎么生成数据库字段说明

ef code first 怎么生成数据库字段说明 At its core, the ADO.NET Entity Framework relies on an Entity Data Model. An EDM provides all the metadata the framework needs to tran...

exception efcreateerror in module coreserver.exe at 0029d7a

电脑出现exception efcreateerror in module coreserver.exe一般都是由系统软件、内存、硬盘引起的。 1、电脑不心装上了恶意软件,或上网时产生了恶意程序,建议用360 卫...

net core 怎么操作数据库

.NET Core 预览版。 Dapper dot net 是一个轻量型的ORM,但是性能很强大。 有了.NET Core MySQL Connector 我们可以直接使用ADO.NET 操作数据库。 目前EF Core 暂...

net core何时支持datatable

DataSet 是离线的数据源 DataTable 是数据源中的表.当然也可以自己建一张虚表。

如何收集java进程产生的coredump文件及相关数据

-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=c:\heapdump2. solaris: 首先在运行的脚本中添加参数-XX:+HeapDumpOnCtrlBreak。利用ps -ef | grep java 找...

如何产生javacore文件和heapdump文件

pid> 执行kill -3 <pid>命令可以生成javacore文件和heapdump文件(pid为was java进程的id号,可以用ps -ef|grep java 查到),可以多执行几次,按照下面操作进行 ps -ef &g...

[Websphere]如何产生javacore文件和heapdump文件

<pid> 执行kill -3 <pid>命令可以生成javacore文件和heapdump文件(pid为was java进程的id号,可以用ps -ef|grep java 查到),可以多执行几次,按照下面操作进行 ps -ef &g...

EF Core什么时间来触发从数据库中执行查询

答:to_number(to_char(t.access_time,'yyyy-MM-dd hh24:mm:ss')) access_time, 这句话出错. 原因 假如 t.access_time = 2011年10月10日 10:00:00 那么 to_char(t.access_time,'yyyy-MM-dd hh24:mm:ss') 的结果 = 2011-10-10 10:00:00 然后你想 to_n...

ef core使用code first无法为mysql数据表设置字段...

答:这里我们选择 ASP.NET Core Web Application (.NET Core) 这里选择web 应用程序,然后更改身份验证 改为 不进行身份验证 然后再包管理控制台里执行下面两条命令 引用 EntityFrameworkCore Install-Package Microsoft.EntityFrameworkCore 再引用...

C#中的语法糖和EF Core的语法问题。

答:就是为了开发人员开发方便。语言发明出来以后,随着程序员的使用,越来越多的使用需求被反馈到了厂家。为了满足开发者的需要,厂家就逐步增加语法糖了呗。

ef core的迁移只能在web层吗

答:这个是有问题,换退货恐怕不行,去说说看吧。实在不行拿去维修吧,镜头除尘也不是难事,有保修不收费的。

EF Core反向生成实体后,数据库发生了更改,如何更...

答:梦稿本《红楼梦稿)

asp.net core里面,EF和NH哪个对Oracle的支持更好?

答:在asp.net core 里非常建议使用entity framework,因为新的entity framework core定义了一套接口标准,就如同ado.net一样,只要有厂家实现了这套接口就行,而且厂家的实现肯定会更好一些。在asp.net core 里非常建议使用entity framework,因为...

命名空间"System.Data.Entity"中不存在类型或命名...

答:你没有安装EF吧。 解决方法: 1、打开VS。 2、依次点击工具-Nut程序包管理器--程序包管理器控制台。 3、在控制台中输入“Install-Package Entity...

ef.reverse.poco.core 有没有mysql版本的

答:rpm -aq|grep -i mysql 一个命令可以实现你的两个问题,如果没结果,说明没有,已经有,可以看到版本

VS开发时使用EF框架,调试连接数据库不正常.用IIS配...

答:检查一下EF连接数据库时候使用的连接字符串看是不是有问题。

微软EF框架存储过程问题,VS2012+.NET4.5+EF6.1.1

答:我用的是5.0没这个问题,不过如果你理解T4模板的话这个问题很好解决。 这个应该是6.0重构了一些命名空间后,和VS原有的实体数据模型模板不一致了。 解决办法如下:修改你的 xx.Context.tt 文件: if (container.FunctionImports.Any()){#>using ...


请注意,本站信息均收集自互联网,相关信息仅供参考,医疗等重要信息请以正规途径为最终意见,本站不承担任何责任!

www.wosoni.com false 互联网 http://www.wosoni.com/blogcnk/mm/ccdkfj.html report 5888 解决方案1:试试 builder.Property(x => x.Id).ValueGeneratedNever();收获园豆:10============================================感谢,已解决。但是同时又发现了新的问题:在修改主键字段属性的时候,EF Core会报错【更改列的IDENTITY属性,需要删除并重新创建列】,只能删掉再重新创建。搜索后发现,在EF Core的源码下已经有人提过issue了(https://github.co

热门图片