C# 引用仍然为空

C# 引用仍然为空,c#,entity-framework,dbcontext,C#,Entity Framework,Dbcontext,我想我遇到了一个bug,似乎EF在删除和重新插入实体后并没有很好地处理引用。我已经用下面的代码复制了它(假设除了我在注释中提到的那一个之外,所有的断言都通过了): var database = new TestEntities(); // select and delete the info record var info = database.Info.First(i => i.ID == 1); Assert.AreEqual(1, info.MemberID); // when

我想我遇到了一个bug,似乎EF在删除和重新插入实体后并没有很好地处理引用。我已经用下面的代码复制了它(假设除了我在注释中提到的那一个之外,所有的断言都通过了):

var database = new TestEntities();

// select and delete the info record
var info = database.Info.First(i => i.ID == 1);
Assert.AreEqual(1, info.MemberID);
// when i uncomment the line below the last Assert fails
// Assert.IsNotNull(info.Member);
database.Info.Remove(info);

// add it again and persist it to the database
database.Info.Add(new Info {
    ID = 1,
    MemberID = 1
});
database.SaveChanges();

// should not be null ? EDIT: i guess i understand this becoming null
Assert.IsNull(info.Member);

// and even here its still null
info = database.Info.First(i => i.ID == 1);
Assert.IsNull(info.Member);

有人能告诉我这是怎么回事吗?

编辑: My实体首先使用数据库生成,im使用DbContext/POCO生成器生成

public partial class Member
{
    public Member()
    {
        this.Info = new HashSet<Info>();
    }

    public int ID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Info> Info { get; set; }
}

public partial class Info
{
    public int ID { get; set; }
    public int MemberID { get; set; }

    public virtual Member Member { get; set; }
}
公共部分类成员
{
公职人员()
{
this.Info=newhashset();
}
公共int ID{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection信息{get;set;}
}
公共部分类信息
{
公共int ID{get;set;}
public int MemberID{get;set;}
公共虚拟成员成员{get;set;}
}
鉴于此

var info = database.Info.First(i => i.ID == 1);
Assert.AreEqual(1, info.MemberID);
你不是在比较info.ID和info.MemberID吗?ID和MemberID不可能是不同的吗

另外,您不应该在之后使用.SaveChanges()吗

?


此外,如果没有实例化,则info没有可用的.member。是否存在MemberID等于info.MemberID的关联成员?

结果表明,它与删除和重新插入无关,实际上并非如此。很明显

我是使用一个POCO插入的,这个POCO没有被急切地加载,也没有任何延迟加载功能

第二次查询同一条记录时,我希望有一个代理,但似乎POCO是由EF缓存的,这就是它返回的结果,这意味着仍然没有急切或延迟加载


我可以通过确保EF不会从缓存中检索第二个查询、使用代理插入(
var info=database.info.Create()
)或在查询中包含成员(
database.info.Include(I=>I.member))来修复它。首先(I=>I==1)
)。

尝试关闭延迟加载。您的实体是如何定义的?代码优先?从数据库生成?@cadrell0-恐怕这不是一个选项,因为我需要延迟加载。@Malcolm O'Hare-我已将该信息添加到我的问题中。我理解混淆,该成员也有ID 1(是的,该成员存在于数据库中)。关于
.Remove()
之后的
.SaveChanges()
,不幸的是,这没有任何区别。
database.Info.Remove(info);