![](/img/trans.png)
[英]Auto-increment on partial primary key with Entity Framework Core
[英]Auto increment non key value entity framework core 2.0
我有一个对象,有一个密钥存储为GUID以及一个friendlyID,如下所示:
public class Job {
[Key]
public Guid Id { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int FriendlyId { get; set; }
public string Description { get; set; }
}
但是当我尝试使用我的更新方法更新描述时:
public void Update(Job job, Job jobParam) {
if (job == null) {
throw new AppException("Job does not exist");
}
//Update job properties
job.Description = jobParam.Description;
_context.Job.Update(job);
_context.SaveChanges();
}
我收到一个错误说明:
System.Data.SqlClient.SqlException:无法更新标识列'FriendlyId'
我已经确保正确的对象正在尝试更新,但我无法理解为什么在没有更改时,friendlyID会尝试更新。 在线查看时我可以看到EF核心1.1中存在一个导致此问题发生的错误,但没有关于2.0或关于不是关键的值的问题。
EF Core中生成的属性的确切行为仍处于调整过程中。 EF Core 2.0引入了两个新的属性元数据属性 - BeforeSaveBehavior
和AfterSaveBehavior
。 没有用于设置它们的数据注释/流畅API,默认情况下,它们是从值生成策略以及属性是否是密钥的一部分隐含的。 同时它们会影响跟踪操作的行为。
这里的问题是,对于不属于键的标识列(即ValueGeneratedOnAdd
), AfterSaveBehavior
是Save
,它反过来使Update
方法将它们标记为已修改,从而生成错误的UPDATE
命令。
要解决这个问题,你必须像这样设置AfterSaveBehavior
(在OnModelCreating
覆盖内):
modelBuilder.Entity<Job>()
.Property(e => e.FriendlyId)
.ValueGeneratedOnAdd()
.Metadata.AfterSaveBehavior = PropertySaveBehavior.Throw; // <--
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.