Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6.1-代码优先-未正确加载引用属性_C#_.net_Entity Framework - Fatal编程技术网

C# 实体框架6.1-代码优先-未正确加载引用属性

C# 实体框架6.1-代码优先-未正确加载引用属性,c#,.net,entity-framework,C#,.net,Entity Framework,我首先注意到EF 6.1代码有一个问题。我有以下课程- namespace Domain { public interface ISupportsOptimisticConcurrency { byte[] RowVersion { get; set; } } public class Entity : ISupportsOptimisticConcurrency { public int Id { get; set; }

我首先注意到EF 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; }
    }
}
我编写了一个典型的存储库类,用于从DB访问数据。现在,当我尝试按Id查找组并包含GroupType时,GroupType无法正确加载,GroupType的Name属性为null

有趣的是,当我删除初始化新GroupType的组构造函数时,一切都开始正常工作了

你能解释一下这种行为吗? 注意:同样的场景也适用于NHibernate


感谢您的回复。

我认为您必须删除组构造函数中的初始化逻辑:

 GroupType = new GroupType();
这可能会覆盖加载的数据,或者甚至不会加载它(因为它已经被实例化),从而导致GroupType属性成为初始化它的实例,而不是数据库中的实例


这可能与解释的问题相同。

如果我不得不猜测,我会说与继承(以及多个非抽象类型)有关。GroupType没有其他可用属性,因此鉴别器可能会混淆<代码>实体对于初学者来说应该是
抽象的
,然后为
查找定义或声明一个鉴别器
vs
GroupType
。可能发生的情况是EF看到已经有一个GroupType,所以它不会实例化一个新的。为什么有实例化GroupType的构造函数?您是否将其与集合导航属性混为一谈?这些在构造函数中被实例化,但是不应该使用单一的引用导航属性。是的,我必须这样做,但这违反了OO的原则,因为如果我不在构造函数中初始化引用类型,我就不能使用C#对象初始化语法,例如,这失败了-var gr=new Group(){Name=“Name”,GroupType={Name=“gt”,Description=“desc”};我不确定这样做是不是一个好主意。初始化集合可能是您想要做的事情,但初始化引用类型可能是您在构造函数中不需要做的事情。null是属性的有效状态。