0

我有以下模型:

public class Job
{
    [Key]
    public int JobID { get; set; }
    public string Status { get; set; }
    public DateTime JobDate { get; set; }
    public string JobTitle { get; set; }
    public int? Cleaner { get; set; }
    public int? Client { get; set; }
    public int EstTime { get; set; }

    public virtual Client ClientInfo { get; set; }
    public virtual Valeter ValeterInfo { get; set; }
}

这在 OnModelCreating 中:

// Relationship Job -> Valeter
        modelBuilder.Entity<Job>()
            .HasOptional<Valeter>(u => u.ValeterInfo)
            .WithMany()
            .HasForeignKey(e => e.Cleaner);

(注意:它使用的是现有数据库)。当我尝试执行以下操作时:

if (ModelState.IsValid)
{
   db.Entry(job).State = EntityState.Modified;
   db.SaveChanges();
}

它通常工作正常,除非我将 Cleaner 值更改为其他值,然后我得到错误:

发生参照完整性约束冲突:定义参照约束的属性值在关系中的主体对象和从属对象之间不一致。

4

1 回答 1

2

job.ValeterInfo != null 如果和 , 通常会发生此异常job.ValeterInfo.ValeterId != job.Cleaner。因此,最简单的解决方案是在将导航属性附加到上下文null之前将其设置为:job

if (ModelState.IsValid)
{
    job.ValeterInfo = null;
    db.Entry(job).State = EntityState.Modified;
    db.SaveChanges();
}

这看起来有点奇怪,就像一个黑客。但问题是为什么job.ValeterInfo不是null当您将数据发布到控制器操作时。当您将状态设置为 时jobModified您只会更新作业的标量属性(包括Cleaner),而不是任何属性job.ValeterInfo或任何关系。因此,您不需要首先将job.ValeterInfo属性发送到服务器。

无论如何,您有一个不一致之处: FKjob.Cleaner已更改,但相关实体job.ValeterInfo(尤其是其主键属性ValeterId)未更改。EF 不知道哪个代表正确的关系:外键属性值还是导航属性值?这种歧义导致异常。

于 2012-11-14T20:31:09.557 回答