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