2014-05-09 82 views
0

我已經注意到EF 6.1代碼的問題。我有以下類 -Entity Framework 6.1 - 代碼優先 - 引用屬性加載不正確

namespace Domain 
{ 
    public interface ISupportsOptimisticConcurrency 
    { 
     byte[] RowVersion { get; set; } 
    } 

    public class Entity : ISupportsOptimisticConcurrency 
    { 
     public int Id { get; set; } 

     [Timestamp] 
     public byte[] RowVersion { get; set; } 
    } 

    public class Lookup : Entity 
    { 
     public Lookup() 
     { 
      Description = string.Empty; 
     } 

     [Required] 
     [MaxLength(100)] 
     public string Name { get; set; } 

     [MaxLength(300)] 
     public string Description { get; set; } 
    } 

    public class GroupType : Lookup 
    { 
    } 

    public class Group:Entity 
    { 
     public Group() 
     { 
       GroupType = new GroupType(); 
     } 

     [Required] 
     public string Name { get; set; } 

     [Required] 
     public Guid ExternalId { get; set; } 

     [Required] 
     public string Password { get; set; } 

     [Required] 
     public string MonitorEmail { get; set; } 

     public string UrlRequestEmail { get; set; } 

     public bool UsesDefaultOptions { get; set; } 

     [ForeignKey("GroupType")] 
     public int GroupTypeId { get; set; } 
     public virtual GroupType GroupType { get; set; } 
    } 
} 

我寫了一個典型的存儲庫類來訪問數據庫中的數據。現在,當我嘗試查找按組標識幷包含GroupType時,GroupType無法正確加載,並且GroupType的Name屬性爲空。

有趣的是,當我刪除初始化一個新GroupType的Group構造函數時,事情開始正常工作。

你能解釋一下這種行爲嗎? 注意:這個場景和NHibernate一樣正常工作。

感謝您的回覆。

+0

如果我不得不猜測,我會說與繼承(和多個非抽象類型)有關。沒有其他屬性可用於GroupType,因此鑑別器可能會感到困惑。對於初學者,「實體」應該是「抽象的」,然後在定義或聲明「查找」與「組類型」的鑑別器。 –

+0

可能發生的事情是EF看到已經有一個GroupType,所以它沒有實例化一個新的。爲什麼你有構造函數實例化GroupType?你是否將它與集合導航屬性相混淆?那些在構造函數中實例化的,但單數的引用導航屬性不應該。 –

回答

1

我認爲你必須刪除初始化邏輯在組構造:

GroupType = new GroupType(); 

這可能會覆蓋已加載的數據,甚至不會加載它(因爲它已經被實例化),導致GroupType屬性是你初始化它的實例,而不是數據庫中的實例。

它可能與解釋here相同的問題。

+0

是的,我必須這樣做,但它違背了OO的原則,因爲如果我沒有在構造函數中初始化引用類型,我不能使用C#對象初始化語法,例如這個失敗 - 變種GR =新的組() { 名稱= 「姓名」, GroupType = { 名稱= 「GT」, 描述= 「desc」 的 } }; – mmwaikar

+0

我不確定這是不是一個好主意。初始化集合是您可能想要做的事情,但初始化引用類型是您在構造函數中不會執行的操作。爲null是一個財產的有效狀態。 –

相關問題