3

我的 Entity Framework 4 模型(与 MS SQL Server Express 一起使用)中有一个多对多关系:Patient-PatientDevice-Device。我正在使用 Poco,所以我的 PatientDevice 类如下所示:

public class PatientDevice
{
    protected virtual Int32 Id { get; set; }
    protected virtual Int32 PatientId { get; set; }
    public virtual Int32 PhysicalDeviceId { get; set; }
    public virtual Patient Patient { get; set; }
    public virtual Device Device { get; set; }

    //public override int GetHashCode()
    //{
    //    return Id;
    //}
}

当我这样做时一切正常:

var context = new Entities();
var patient = new Patient();
var device = new Device();

context.PatientDevices.AddObject(new PatientDevice { Patient = patient, Device = device });
context.SaveChanges();

Assert.AreEqual(1, patient.PatientDevices.Count);

foreach (var pd in context.PatientDevices.ToList())
{
    context.PatientDevices.DeleteObject(pd);
}
context.SaveChanges();

Assert.AreEqual(0, patient.PatientDevices.Count);

但是如果我在 PatientDevice-class 中取消注释 GetHashCode,患者仍然有之前添加的 PatientDevice。

覆盖 GetHashCode 并返回 Id 有什么问题?

4

1 回答 1

1

原因很可能是类类型不是哈希码的一部分,实体框架很难区分不同的类型。

尝试以下操作:

public override int GetHashCode()
{
    return Id ^ GetType().GetHashCode();
}

另一个问题是GetHashCode()在某些情况下,在对象的生命周期内结果可能不会改变,而这些可能适用于实体框架。这与Id创建时的 begin 0 一起也会带来问题。

的替代方案GetHashCode()是:

private int? _hashCode;

public override int GetHashCode()
{
    if (!_hashCode.HasValue)
    {
        if (Id == 0)
            _hashCode.Value = base.GetHashCode();
        else
            _hashCode.Value = Id;
            // Or this when the above does not work.
            // _hashCode.Value = Id ^ GetType().GetHashCode();
    }

    return _hasCode.Value;
}

取自http://nhforge.org/blogs/nhibernate/archive/2008/09/06/identity-field-equality-and-hash-code.aspx

于 2010-11-15T14:59:38.773 回答