c# - Entity Framework 5 不清除导航属性

标签 c# .net entity-framework ado.net entity-framework-5

我在 Entity Framework 5 中遇到了这个奇怪的问题,其中我的一个实体中有一个导航属性,我想将其设置为 null。但出于某种原因,该属性仅在我第二次调用该属性时才被清除:

using (var db = new Entities())
{
    var vehicle = db.Vehicles.Single(v => v.Id == vehicleId);

    // After this call, ParkingBay is still set.
    vehicle.ParkingBay = null;

    // Only after this call, ParkingBay becomes null.
    vehicle.ParkingBay = null;

    db.SaveChanges();
}

Entity Framework 生成的 Vehicle 类如下所示:

public partial class Vehicle
{
    public int Id { get; set; }
    public System.DateTime CreatedOn { get; set; }
    public int CreatedBy { get; set; }
    public virtual ParkingBay ParkingBay { get; set; }
}

这段代码不是很精彩,在运行时 Entity Framework 为 VehicleParkingBay 生成代理类,但我不明白里面发生了什么 ParkingBay 属性无法在第一次调用时清除该属性。

VehicleParkingBay 之间是SQL Server 中的正常外键关系。这里没有什么特别的。

更新

ParkingBay 看起来像这样:

public partial class ParkingBay
{
    public ParkingBay()
    {
        this.Vehicles = new HashSet<Vehicle>();
    }

    public int Id { get; set; }
    public System.DateTime CreatedOn { get; set; }
    public int CreatedBy { get; set; }

    public virtual ICollection<Vehicle> Vehicles { get; set; }
}

这是怎么回事?有人能告诉我我做错了什么吗?

最佳答案

在查询语句 (db.Vehicles.Single ...) 之后,属性 null,因为您没有加载它。为其分配另一个值不会触发延迟加载,因此此处没有任何变化。

只有当属性被实际加载时,赋值(任何赋值,也被另一个对象替换它)才会有效果。如果未加载该属性,则更改跟踪器没有任何可跟踪的内容。

可以通过将其包含在查询中来加载该属性

db.Vehicles.Include(v => v.ParkingBay)...

或者稍后在代码中解决它,例如

var pb = vehicle.ParkingBay; // triggers lazy loading.

或者通过在调试器(watch 或 quickview)中检查它,这也会触发延迟加载。

如果您打算对导航属性本身应用任何更改,则推荐使用

Include 方法。

如下所述,清除引用导航属性的一种更有效的方法是在模型中公开原始外键值并将其设置为 null。在您的情况下,这类似于 int? ParkingBayId。这种模式称为外键关联,与独立关联相反,当仅存在引用属性时。

关于c# - Entity Framework 5 不清除导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22557699/

相关文章:

c# - 如何在 Silverlight 中使用 Web 配置文件

c# - == 和 .Equals() 与接口(interface)和 LINQ 之间的区别

c# - 获取类实现的接口(interface)

c# - 这是一个有效的 XML 文件吗?

c# - .NET中进行事后分析的可能性有哪些(例如,程序崩溃后)?

c# - Visual Studio 2010 Entity Framework .edmx 不可编辑

c# - ASP.NET MVC 2 显示()

c# - 如何处理所有 Controller 上的空模型 aspnet core c#

C# EF 从一个表中查找数据的最佳方法

c# - 如果我忽略用于某个过程的 dbset,我将无法使用 EF Core 获取该过程