Sea*_*ean 6 c# entity-framework entity-framework-core .net-core
我有一个对象,有一个密钥存储为GUID以及一个friendlyID,如下所示:
public class Job {
[Key]
public Guid Id { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int FriendlyId { get; set; }
public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用我的更新方法更新说明时:
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();
}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误说明:
System.Data.SqlClient.SqlException:无法更新标识列'FriendlyId'
我已经确保正确的对象正在尝试更新,但我无法理解为什么在没有更改时,friendlyID会尝试更新.在线查看时我可以看到EF核心1.1中存在一个导致此问题发生的错误,但没有关于2.0或关于不是关键的值的问题.
EF Core中生成的属性的确切行为仍处于调整过程中.EF Core 2.0引入了两个新的属性元数据属性 - BeforeSaveBehavior和AfterSaveBehavior.没有用于设置它们的数据注释/流畅API,默认情况下,它们是从值生成策略以及属性是否是密钥的一部分隐含的.同时它们会影响跟踪操作的行为.
这里的问题是,对于不是键的一部分的标识列(即ValueGeneratedOnAdd),is ,它反过来使方法将它们标记为已修改,从而产生错误的命令.AfterSaveBehaviorSaveUpdateUPDATE
要解决这个问题,你必须AfterSaveBehavior像这样设置(内部OnModelCreating覆盖):
modelBuilder.Entity<Job>()
.Property(e => e.FriendlyId)
.ValueGeneratedOnAdd()
.Metadata.AfterSaveBehavior = PropertySaveBehavior.Throw; // <--
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
608 次 |
| 最近记录: |