自动增量非关键值实体框架核心2.0

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或关于不是关键的值的问题.

Iva*_*oev 5

EF Core中生成的属性的确切行为仍处于调整过程中.EF Core 2.0引入了两个新的属性元数据属性 - BeforeSaveBehaviorAfterSaveBehavior.没有用于设置它们的数据注释/流畅API,默认情况下,它们是从值生成策略以及属性是否是密钥的一部分隐含的.同时它们会影响跟踪操作的行为.

这里的问题是,对于不是键的一部分的标识列(即ValueGeneratedOnAdd),is ,它反过来使方法将它们标记为已修改,从而产生错误的命令.AfterSaveBehaviorSaveUpdateUPDATE

要解决这个问题,你必须AfterSaveBehavior像这样设置(内部OnModelCreating覆盖):

modelBuilder.Entity<Job>()
    .Property(e => e.FriendlyId)
    .ValueGeneratedOnAdd()
    .Metadata.AfterSaveBehavior = PropertySaveBehavior.Throw; // <--
Run Code Online (Sandbox Code Playgroud)