2014-05-09 81 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是一个财产的有效状态。 –

相关问题