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

时间:2018-02-07 13:33:48

标签: c# entity-framework .net-core entity-framework-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; }
}

但是,当我尝试使用更新方法更新说明时:

    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或关于不是一个关键值的值。

1 个答案:

答案 0 :(得分:5)

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

这里的问题是,对于一部分键的标识列(即ValueGeneratedOnAdd),AfterSaveBehaviorSave,而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);