Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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# 未从数据库加载实体框架关系_C#_Database_Entity Framework_Ado.net_Entity Framework 6 - Fatal编程技术网

C# 未从数据库加载实体框架关系

C# 未从数据库加载实体框架关系,c#,database,entity-framework,ado.net,entity-framework-6,C#,Database,Entity Framework,Ado.net,Entity Framework 6,我首先要处理EntityFramework6代码,问题是多对多关系没有正确地同步到我的“内部”对象 我上了以下课程: public class ClassA { public String AId { get; set; } public ICollection<ClassB> Bs { get; set; } public ICollection<ClassC> Cs { get; set; } } public class ClassB {

我首先要处理EntityFramework6代码,问题是多对多关系没有正确地同步到我的“内部”对象

我上了以下课程:

public class ClassA
{
    public String AId { get; set; }
    public ICollection<ClassB> Bs { get; set; }
    public ICollection<ClassC> Cs { get; set; }
}
public class ClassB
{
    public int BId { get; set; }
    ICollection<ClassA> As { get; set; }
}
public class ClassC
{
    public int CId { get; set; }
    public ClassA A { get; set; }
}
但是,如果我再次执行我的测试程序,则关系不会正确恢复

这意味着:

  • ClassA中B的集合不包含任何对象(反之亦然)
  • 如果我事先通过数据库上下文访问了ClassC对象,那么我只能通过ClassA访问ClassC对象
我必须手动调用同步还是模型定义中有错误


提前谢谢

您没有正确构建课程。从逻辑上考虑,您需要将多对多绑定存储在某处,这意味着您需要第三个实体类来存储多对多关系

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
让您的课程如下所示:

public class ClassA
{
    [Index(IsUnique = true)]
    [MaxLength(200)]
    public String AId { get; set; }
    public virtual List<AB> AB { get; set; }
    public List<ClassC> C { get; set; }
}
public class ClassB
{
    public int BId { get; set; }
    public virtual List<AB> AB { get; set; }
}
public class AB
{
    public int Id { get; set; }
    [Required]
    public virtual A A { get; set; }
    [Required]
    public virtual B B { get; set; }
    [MaxLength(200)]
    public string AId { get; set; }
    public int BId { get; set; }
}
public class ClassC
{
    public int CId { get; set; }
    public ClassA A { get; set; }
    public int AId { get; set; }
}
公共类ClassA
{
[索引(IsUnique=true)]
[MaxLength(200)]
公共字符串辅助{get;set;}
公共虚拟列表AB{get;set;}
公共列表C{get;set;}
}
公共B类
{
公共整数BId{get;set;}
公共虚拟列表AB{get;set;}
}
公共AB类
{
公共int Id{get;set;}
[必需]
公共虚拟A{get;set;}
[必需]
公共虚拟B{get;set;}
[MaxLength(200)]
公共字符串辅助{get;set;}
公共整数BId{get;set;}
}
公共类C类
{
公共int-CId{get;set;}
公共类A{get;set;}
公共int-AId{get;set;}
}

创建代码优先迁移,实体框架将理解这一点,并相应地勾画出数据库。只将A和B的ID存储在第三个实体AB中。

您没有正确构建类。从逻辑上考虑,您需要将多对多绑定存储在某处,这意味着您需要第三个实体类来存储多对多关系

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
让您的课程如下所示:

public class ClassA
{
    [Index(IsUnique = true)]
    [MaxLength(200)]
    public String AId { get; set; }
    public virtual List<AB> AB { get; set; }
    public List<ClassC> C { get; set; }
}
public class ClassB
{
    public int BId { get; set; }
    public virtual List<AB> AB { get; set; }
}
public class AB
{
    public int Id { get; set; }
    [Required]
    public virtual A A { get; set; }
    [Required]
    public virtual B B { get; set; }
    [MaxLength(200)]
    public string AId { get; set; }
    public int BId { get; set; }
}
public class ClassC
{
    public int CId { get; set; }
    public ClassA A { get; set; }
    public int AId { get; set; }
}
公共类ClassA
{
[索引(IsUnique=true)]
[MaxLength(200)]
公共字符串辅助{get;set;}
公共虚拟列表AB{get;set;}
公共列表C{get;set;}
}
公共B类
{
公共整数BId{get;set;}
公共虚拟列表AB{get;set;}
}
公共AB类
{
公共int Id{get;set;}
[必需]
公共虚拟A{get;set;}
[必需]
公共虚拟B{get;set;}
[MaxLength(200)]
公共字符串辅助{get;set;}
公共整数BId{get;set;}
}
公共类C类
{
公共int-CId{get;set;}
公共类A{get;set;}
公共int-AId{get;set;}
}

创建代码优先迁移,实体框架将理解这一点,并相应地勾画出数据库。仅将A和B的ID存储在第三个实体AB中。

对于任何面临与我相同问题的人,我的问题是我在相关实体中缺少了单词
virtual
。据我所知,启用延迟加载时需要使用
virtual
,这有助于实体框架正确加载导航属性。希望能有帮助


对于任何比我面临同样问题的人,我的问题是我在相关实体中缺少了
virtual
这个词。据我所知,启用延迟加载时需要使用
virtual
,这有助于实体框架正确加载导航属性。希望能有帮助


用于从数据库具体化对象的代码在这里可能很有用。根据上下文配置,可能存在使用.Include()的问题。用于从数据库具体化对象的代码在这里可能很有用。根据上下文配置,使用.Include()可能会有问题。在基于对象的模型中,这样的链接类真的有必要吗?由于数据库中的结果是正确的,我认为Entity Framework会在内部创建这样一个链接类,这是OnModelCreating方法中的“HasMany()…WithMany()”规范的结果。我的观点是,我不必在基于对象的模型中明确定义此类链接类,实体框架可以透明地处理此类。相信我,我在开始时也这么认为,不幸的是,它没有。这实际上是正确的方法。如果使用这种方法,数据将加载到内存中。然而,仍然存在延迟加载的问题。EF只将条目添加到我使用上下文的DbSet手动显式访问的ClassA和ClassB的AB列表中。是否有类似“将所有内容加载到内存”的命令?我没有在我的上下文的配置中将条目指定为虚拟和禁用的延迟加载。您可能还希望签入
Include
方法。我建议你看看我的答案,在我的基于对象的模型中,这样的链接类真的是必要的吗?由于数据库中的结果是正确的,我认为Entity Framework会在内部创建这样一个链接类,这是OnModelCreating方法中的“HasMany()…WithMany()”规范的结果。我的观点是,我不必在基于对象的模型中明确定义此类链接类,实体框架可以透明地处理此类。相信我,我在开始时也这么认为,不幸的是,它没有。这实际上是正确的方法。如果使用这种方法,数据将加载到内存中。然而,仍然存在延迟加载的问题。EF只将条目添加到我使用上下文的DbSet手动显式访问的ClassA和ClassB的AB列表中。是否有类似“将所有内容加载到内存”的命令?我没有在我的上下文的配置中将条目指定为虚拟和禁用的延迟加载。您可能还希望签入
Include
方法。我建议你看看我的答案