我正在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)
几乎相同的代码在整个应用程序中被编写了数百次-并且运行正常(即使对于完全相同的实体)。
我不知道发生了什么,为什么,到目前为止,我尝试过的所有解决方案都没有用。
我们将非常感谢您的帮助!
谢谢
尼尔
答案 0 :(得分:0)
事实证明,解决方案完全是其他地方。 正如@gregH和@ tschmit007指出的那样,EF跟踪实体中的更改。 一旦我们开始将'DataContext.SaveChanges()'命令移到执行链的较高位置,我们发现对较高位置的一个实体进行更改会导致此问题。 实际的问题是将子集合属性修改为DailyTrack实体。修改包括过滤集合数据(对集合执行的LINQ WHERE Claus)。
谢谢大家的帮助。