关系无法更改,外键不可为空

时间:2019-03-14 12:15:36

标签: c# asp.net-mvc entity-framework ef-code-first repository-pattern

我正在MSSQL DB上运行一个(旧的)MVC3 Web应用程序,首先使用EF 6.0代码和存储库模式。

该系统已经投入生产运行了7年(EF大约在1年前进行了更新)。

我在系统的1个特定区域遇到了一个非常奇怪的异常。 尝试创建或更新某些实体时,遇到以下异常:

  

操作失败:无法更改关系,因为   一个或多个外键属性不可为空。当一个   更改关系后,相关外键属性为   设置为空值。如果外键不支持空值,   必须定义新的关系,外键属性必须为   分配另一个非空值,否则不相关的对象必须是   删除。

这是有问题的实体之一:

public class BeaconAppErrorLog

    {

        [Key]
        public int Id { get; set; }
        public int EntityId { get; set; }
        public string RawJson { get; set; }
        public DateTime SavedAt { get; set; }

        public int? EmployeeId { get; set; }    
        [ForeignKey("EmployeeId")]
        public Employee Employee { get; set; }

        public int? ContainerId { get; set; }
        [ForeignKey("ContainerId")]
        public Container Container { get; set; }

        public int? DailyTrackId { get; set; }
        [ForeignKey("DailyTrackId")]
        public DailyTrack DailyTrack { get; set; }

        public int? ClientId { get; set; }
        [ForeignKey("ClientId")]
        public Client Client { get; set; }

        public string Error { get; set; }
    }

这是创建和保存的代码:

 DataContext.BeaconAppErrorLogs.Add(new BeaconAppErrorLog()

                    {
                        EntityId = 2,
                        SavedAt = DateTime.Now,
                        EmployeeId = activity.EmployeeId,
                        DailyTrackId = activity.DailytrackId,
                        Error = error
                    });


DataContext.SaveChanges();

“ EmployeeId”和“ DailyTrackId”字段是外键,它们会收到 有效值(即对应于相应实体并存在于数据库中的ID)

几乎相同的代码在整个应用程序中被编写了数百次-并且运行正常(即使对于完全相同的实体)。

我不知道发生了什么,为什么,到目前为止,我尝试过的所有解决方案都没有用。

我们将非常感谢您的帮助!

谢谢

尼尔

1 个答案:

答案 0 :(得分:0)

事实证明,解决方案完全是其他地方。 正如@gregH和@ tschmit007指出的那样,EF跟踪实体中的更改。 一旦我们开始将'DataContext.SaveChanges()'命令移到执行链的较高位置,我们发现对较高位置的一个实体进行更改会导致此问题。 实际的问题是将子集合属性修改为DailyTrack实体。修改包括过滤集合数据(对集合执行的LINQ WHERE Claus)。

谢谢大家的帮助。

相关问题