C# 更新导航属性有效,但集合中未显示实体

C# 更新导航属性有效,但集合中未显示实体,c#,entity-framework,C#,Entity Framework,我有两个实体,用户和材料。用户持有材料的集合 public class User { ... private ICollection<Material> materials; public virtual ICollection<Material> Materials { get { return materials ?? (materials = new List<Material>()); }

我有两个实体,用户和材料。用户持有材料的集合

public class User
{
...

private ICollection<Material> materials;

        public virtual ICollection<Material> Materials
        {
            get { return materials ?? (materials = new List<Material>()); }
            set { materials = value; }
        }
}
当记录的用户选择材质时,我将该用户分配给Material.User并保存更改。工作正常,更改保存在db中。但是,如果我想使用User.materials访问材质,则集合不包含任何元素。我已经尝试过简单的项目,在那里它的工作。就我的复杂项目而言,情况并非如此。怎么办

请帮帮我,这个问题已经困扰了8个小时,但还没有解决

编辑:好吧,那太。。。瘸子

我的代码实际上在工作,但是。。。问题是,在查看用户详细信息时,我从数据库中检索到了用户,并使用cUnitStrictor创建了一个副本。我错过了一些东西:

public User(User otherUser)
        {
            Id = otherUser.Id;
            FirstName = otherUser.FirstName;
            LastName = otherUser.LastName;
            Shift = otherUser.Shift;
            PassCode = otherUser.PassCode;
            Type = otherUser.Type;

            Materials = otherUser.Materials; // this line was missing
        }
添加这一行之后,它就工作了。只是VisualStudio对此表示不满(构造函数中的虚拟成员调用)。怎么办?

您的问题在这里:

    private ICollection<Material> materials;

    public virtual ICollection<Material> Materials
    {
        get { return materials ?? (materials = new List<Material>()); }
        set { materials = value; }
    }
私人收集资料;
公共虚拟信息收集材料
{
获取{返回材料???(材料=新列表());}
设置{materials=value;}
}
实体框架导航属性不能是具有支持字段的属性。它只能是自动属性。因此,您应该使用以下代码:

public class User
{
...

        public virtual ICollection<Material> Materials
        {
            get;
            set;
        }
}
公共类用户
{
...
公共虚拟信息收集材料
{
得到;
设置
}
}

删除的代码太多。你的问题没有任何问题,也没有其他问题可以说明。当我选择material时,我调用一个方法,该方法将material的user属性设置为当前登录的用户,如下所示:
public void setboxasuused(material material,user user){material.user=user context.SaveChanges();}
“构造函数中的虚拟成员调用”只是一个警告。如果在子类(例如代理!)中重写了
材质
,您可能会得到。解决方案是将
otherUser.Materials
分配给
Materials
(成员变量,顺便说一句,您可能希望根据常见的命名约定命名
\u Materials
)。我对autoproperty得到了相同的结果。是否使用了延迟加载?当您尝试查看导航属性时,dbcontext是否打开?从数据库获取数据时显示代码,在导航属性中获取null时显示代码。我使用的是延迟加载。它适用于我的项目中的每一个1:M关系,问题就存在于这两个关系之间,稍后我将在其中设置一个导航属性。无论如何,要检索用户:
返回context.Users.Find(id)工作正常,只是集合为空。这里我得到了null异常:
//MessageBox.Show(User.Materials.Count.ToString())˙此外,我已将此集合绑定到listbox,但它当然是空的。如果您希望我们提供帮助,您应该在问题中显示此代码的详细信息(以便我们可以查看您的dbcontext在何处初始化等)。我想,在这个场景中,您有处理上下文的问题。我添加了一些代码。UserRepository基本相同,jsut返回用户实体。
public class User
{
...

        public virtual ICollection<Material> Materials
        {
            get;
            set;
        }
}