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