> 信息中心 >

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

EntityFramework Core 1.1是如何创建DbContext实例...

答:using (var context = new EFCoreContext()) { } 接着通过重载OnConfiguring来配置EF Core上下文实例,如下。 public class EFCoreContext: DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => opt...

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

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

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...

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

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

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

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

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

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

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

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

如何查看ef6生成的sql语句

答:可以使用ToTraceString()方法得到EF查询所生成的SQL。 using (var context = new TestDBEntities()) { var query = from p in context.Parents where p.Name == "Lingzhi" select p; ObjectQuery parents = query as ObjectQuery; if (parents !...

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

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

这个邮箱要在那登陆啊 axrtef03@eyou.com

答:eyou(亿邮)是电子邮箱系统,可以登录个人邮箱也可以登录企业邮箱。 登录亿邮(eyou)的操作方法为: 在百度上搜索eyou(亿邮)邮箱。 打开eyou(亿邮)邮箱的官网。 输入账号密码登录。


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

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

热门图片