c# - Entity Framework 关系未从数据库加载

标签 c# database entity-framework ado.net entity-framework-6

我正在使用 Entity Framework 6 Code First,但遇到多对多关系未正确同步到我的“内部”对象的问题。

我有以下类(class):

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; }
}

A 和 B 具有多对多关系,而 A 和 C 具有一对多关系。我使用 Fluent API 构建映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<ClassA>().ToTable("ClassA");
    modelBuilder.Entity<ClassA>().HasKey(a => a.AId);
    modelBuilder.Entity<ClassA>().HasManyClassB>(a => a.Bs).WithMany(b => b.As).Map(
            a =>
            {
                a.MapLeftKey("AId");
                a.MapRightKey("BId");
                a.ToTable("ClassAClassB");
            });

    modelBuilder.Entity<ClassA>().Property(a => a.OrderId).IsVariableLength().HasColumnName("AId");
    modelBuilder.Entity<ClassB>().ToTable("ClassB");
    modelBuilder.Entity<ClassB>().HasKey(b => b.BId);
    modelBuilder.Entity<ClassB>().Property(b => b.BId)
         .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
         .HasColumnName("BId");
    modelBuilder.Entity<ClassC>().ToTable("ClassC");
    modelBuilder.Entity<ClassC>().HasKey(c => c.CId);
    modelBuilder.Entity<ClassC>().HasRequired(c => c.A).WithMany(a => a.Bs).Map(m => m.MapKey("AId"));
    modelBuilder.Entity<ClassC>().Property(c => c.CId)    
         .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
         .HasColumnName("CId");
}

如果我创建类 ClassA、ClassB 和 ClassC 的对象,将它们添加到我的数据库上下文并调用 SaveChanges()。在我看来,这些值正确地存储在数据库中:

MariaDB [Test]> select * from ClassA;
+----------+
|   BId    |
+----------+
| 2017-002 |
+----------+

MariaDB [Test]> select * from ClassB;
+--------+
|   BId  |
+--------+
|    2   |
+--------+

MariaDB [OMSData]> select * from ClassAClassB;
+----------+-----+
|    AId   | BId |
+----------+-----+
| 2017-002 |  2  |
+----------+-----+

MariaDB [Test]> select * from classC;
+----+-----------+
| CId |    AId   |
+-----+----------+
|  1  | 2017-002 |
+-----+----------+

但是,如果我再次执行我的测试程序,则关系不会正确恢复。

这意味着:

  • B 在 ClassA 中的集合不包含任何对象(反之亦然)。
  • 如果我事先通过我的数据库上下文访问了这个对象,我只能通过 ClassA 访问 ClassC 的对象。

我必须手动调用同步还是模型定义有错误?

提前致谢!

最佳答案

对于遇到与我相同问题的任何人,我的问题是我在相关实体中遗漏了 virtual 一词。据我所知,启用延迟加载时需要 virtual ,这有助于 Entity Framework 正确加载导航属性。希望对您有所帮助。

enter image description here

关于c# - Entity Framework 关系未从数据库加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46019705/

相关文章:

.net - SQL Server 2008 R2 加密 - 使用 Entity Framework

database - 如何将 Pentaho 数据集成与 Amazon RDS 连接

mysql - MySql 中的表联合

asp.net-mvc - 通过 Entity Framework 获取表的最新记录

c# - 获取表单的所有文本框,其名称按升序排列

database - cakephp数据库表定义三个依赖关系

c# - EF5 - 数据库首先创建多对多表

c# - 如何使用 Microsoft 语音对象库将 wav 字节数组写入响应?

c# - 如何使用 DateTime 字段检索上一条和下一条记录?

c# - 创建反向列表时出现 System.NotSupportedException