我有一个对象,其中存储了一个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或关于不是一个关键值的值。
答案 0 :(得分:5)
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; // <--
(在<script>
let window.url = {{ url('/') }}
</script>
覆盖内):
var photo = data.photo;
console.log(window.url + photo);