关系不能改变,外键不可为空

问题描述 投票:0回答:1

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

该系统已在过去7年中投入生产(EF已于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'字段是外键,它们接收有效值(即对应于相应实体并存在于DB中的id)

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

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

对你的帮助表示感谢!

谢谢,

尼尔

c# asp.net-mvc entity-framework ef-code-first repository-pattern
1个回答
0
投票

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

谢谢,大家帮忙。

© www.soinside.com 2019 - 2024. All rights reserved.