繁体   English   中英

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

[英]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引入了两个新的属性元数据属性 - BeforeSaveBehaviorAfterSaveBehavior 没有用于设置它们的数据注释/流畅API,默认情况下,它们是从值生成策略以及属性是否是密钥的一部分隐含的。 同时它们会影响跟踪操作的行为。

这里的问题是,对于属于键的标识列(即ValueGeneratedOnAdd ), AfterSaveBehaviorSave ,它反过来使Update方法将它们标记为已修改,从而生成错误的UPDATE命令。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM