C# 未从数据库加载实体框架关系
我首先要处理EntityFramework6代码,问题是多对多关系没有正确地同步到我的“内部”对象 我上了以下课程: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 {
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
方法。我建议你看看我的答案