【问题标题】:Entity Framework does not load child table实体框架不加载子表
【发布时间】:2022-11-23 04:51:03
【问题描述】:

有一个由 ASP.NET MVC 应用程序使用的 EF 项目。 EF 项目建立在遗留数据库上(使用数据库优先的方法)。

当我尝试为 Machine 加载子记录时,集合 Maschinentagessaetze 保持为空,即使数据库中的记录具有正确的外键。

有什么办法可以调试吗?我不知道可能是什么问题?从我在互联网上找到的内容来看,这应该有效。

// Controller
Machine = db09.Maschinen
              .Include(x => x.Maschinentagessaetze)
              .FirstOrDefault(x => x.DMasId == id);

// after this line, Machine.Maschinentagessaetze is empty

// Models
[Table("t_Maschinen")]
public partial class TMaschinen
{
        public TMaschinen()
        {            
            Maschinentagessaetze = new HashSet<TMaschinentagessaetze>();            
        }

        [Key]
        [Column("d_MAS_ID")]
        public int DMasId { get; set; }

        [Column("o_Bezeichnung")]
        public string OBezeichnung { get; set; } = null!;
       
        public virtual ICollection<TMaschinentagessaetze> Maschinentagessaetze { get; set; }
}

[Table("t_Maschinentagessaetze")]
public partial class TMaschinentagessaetze
{
    [Key]
    [Column("d_MTA_ID")]
    public int DMtaId { get; set; }

    [Column("o_Maschinentagessatz")]
    public decimal OMaschinentagessatz { get; set; }

    [Column("o_Maschine_FK")]
    public int OMaschineFk { get; set; }

    // with [ForeignKey("OMaschineFk")] the problem remains
    public TMaschinen TMaschinen { get; set; }
}

// DbContext

public virtual DbSet<TMaschinen> Maschinen { get; set; } = null!;
public virtual DbSet<TMaschinentagessaetze> Maschinentagessaetze { get; set; } = null!;

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<TMaschinen>()
            .HasMany(m => m.Maschinentagessaetze)
            .WithOne(t => t.TMaschinen)
            .HasForeignKey(m => m.OMaschineFk);
}

// In the database, there is a foreign key constraint on the child table:
ALTER TABLE [dbo].[t_Maschinentagessaetze] WITH CHECK 
    ADD CONSTRAINT [FK_t_Maschinentagessaetze_t_Maschinen] 
        FOREIGN KEY([o_Maschine_FK]) REFERENCES [dbo].[t_Maschinen] ([d_MAS_ID])
            ON DELETE CASCADE  

【问题讨论】:

  • 如果加载单个 Maschinentagessaetze 并包含父项 Maschinen 会发生什么情况?它是否找到正确的Maschinen,还是为空?另外,您使用的是 Entity Framework 还是 Entity Framework Core?

标签: c# sql-server asp.net-mvc entity-framework


【解决方案1】:

我认为你应该重构 OnModelCreating 方法:

父实体

modelBuilder.Entity<TMaschinen>()
         builder.ToTable("TMaschines");
        builder.HasKey(i => i.Id);
        builder.Property(i => i.Id)
            .ValueGeneratedOnAdd();//you decide how to generate id
        builder.Property(i => i.OBezeichnung )
            .HasMaxLength(150)
            .IsRequired();

子实体(添加缺少的属性)

modelBuilder.Entity<TMaschinentagessaetze>()
        builder.ToTable("TMaschinentagessaetzes");
        builder.HasKey(i => i.Id);
        builder.Property(i => i.Id)
            .ValueGeneratedOnAdd(); //you decide how to generate id
        .HasOne(m => m.TMaschinen )
        .WithMany(t => t.Maschinentagessaetze )
        .HasForeignKey(m => m.OMaschineFk);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    相关资源
    最近更新 更多