2010-06-11 118 views
4

我正在使用Visual Studio 2010與.NET 4和實體框架4.我正在使用POCO類而不是EF4生成器。我需要覆蓋Equals()GetHashCode()方法,但這並不奏效。我認爲這是每個人都做的事情,但我在網上找不到任何關於這個問題的信息。實體框架4覆蓋自己類屬性的Equals和GetHashCode

當我編寫我自己的類和Equals方法時,我使用屬性的Equals(),它需要由EF加載才能被填充。像這樣:

public class Item 
{ 
    public virtual int Id { get; set; } 
    public virtual String Name { get; set; } 

    public virtual List<UserItem> UserItems { get; set; } 
    public virtual ItemType ItemType { get; set; } 

    public override bool Equals(object obj) 
    { 
     Item item = obj as Item; 
     if (obj == null) 
     { 
      return false; 
     } 

     return item.Name.Equals(this.Name) 
      && item.ItemType.Equals(this.ItemType); 
    } 

    public override int GetHashCode() 
    { 
     return this.Name.GetHashCode()^this.ItemType.GetHashCode(); 
    } 
} 

該代碼不起作用。問題出現在EqualsGetHashCode,我嘗試從ItemType獲得HashCodeEqual。每次,如果我嘗試通過Linq2Entites獲取數據,我會得到一個NullRefernceException。

一個骯髒的方式來解決它捕獲NullReferenceException異常並返回false(由等於)並返回base.GetHashCode()(由GethashCode),但我希望有一個更好的辦法來解決這個問題。

我已經寫了一個測試項目,用DB和POCO域的SQL腳本,EDMX文件和控制檯測試主要方法。您可以在此處下載: Download

回答

0

您正在使用純代理生成POCO類。在這種情況下,不支持延遲加載,您將不得不創建存儲庫方法來自行加載相關實體。這就是爲什麼你的ItemType實體爲空(並且總是會)。

如果要延遲加載,可以使用EF生成器來構建支持延遲加載的POCO類。

+0

延遲加載工作,如果我刪除Equals/GetHashCode或捕獲NullReferenceException – Zhok 2010-06-11 07:15:10