【问题标题】:EF Core relations between tables表之间的 EF Core 关系
【发布时间】:2021-06-15 08:01:42
【问题描述】:

我对 EF Core 很陌生。我不明白 betweek 表的关系逻辑。

在我的数据上下文中:

modelBuilder.Entity<CorsoStepLezioneSessione>()
                .HasKey(x => new { x.codCorso, x.codStep, x.codLezione, x.codSessione });
            modelBuilder.Entity<CorsoStepLezioneSessione>()
                .HasOne(sessione => sessione.Lezione)
                .WithMany(lezione => lezione.Sessioni)
                .HasForeignKey(sessione => new { sessione.codCorso, sessione.codStep, sessione.codLezione });

modelBuilder.Entity<CorsoStepLezione>()
                .HasMany(lez => lez.Sessioni)
                .WithOne(sess => sess.Lezione)
                .HasForeignKey(sess => new { sess.codCorso, sess.codStep, sess.codLezione });

实体:

public class CorsoStepLezione
    {
        public int codCorso { get; set; }
        public int codStep { get; set; }
        public int codLezione { get; set; }
        public string nome { get; set; }


        public CorsoStepS CorsoStep { get; set; }
        public List<CorsoStepLezioneSessione> Sessioni { get; set; }
    }

public class CorsoStepLezioneSessione
    {
        public int codCorso { get; set; }
        public int codStep { get; set; }
        public int codLezione { get; set; }
        public int codSessione { get; set; }
        public DateTime? data { get; set; }
        public string ora { get; set; }
        
        public CorsoStepLezione Lezione { get; set; }
        public List<CorsoStepLezioniSessioniIscrizione> Iscrizioni { get; set; }

    }

当我打电话时在服务中

var x = _clienteContext.CorsoStepLezioneSessioni.Include(x => x.Lezione)
                    .Where(x => x.codCorso == codCorso && x.codStep == codStep && x.codLezione == codLezione && x.codSessione == codSessione).ToList();

它给了我:“表达式 'x.Lezione' 在 'Include' 操作中是无效的,因为它不代表属性访问:'t => t.MyProperty'。要定位在派生类型上声明的导航,使用强制转换 ('t => ((Derived)t).MyProperty') 或 'as' 运算符 ('t => (t as Derived).MyProperty')。可以通过组合 Where, OrderBy( Descending)、ThenBy(Descending)、Skip 或 Take 操作。有关包含相关数据的更多信息,请参阅http://go.microsoft.com/fwlink/?LinkID=746393."

你能给我一些建议吗?

【问题讨论】:

    标签: c# entity-framework entity-framework-core


    【解决方案1】:

    复合键和属性命名会让事情变得有点难以区分,但是使用 EF 应该避免的一件事是从两端声明关系。使用复合键具有多个级别的实体关系似乎相当不寻常。您是否有以下各项的表和实体?

    • 科索
    • 步骤
    • 莱齐奥内
    • 会议
    • CorsoStepLezione
    • CorsoStepLezioneSessione

    给定 A 类引用 B 类的集合,而 B 类包含对 A 的引用,您应该从一侧或另一侧映射关系,而不是两者:

    即(我的 EF Core 映射语法可能不是 100% 准确)

    modelBuilder.Entity<A>()
        .HasMany(a => a.Bs)
        .WithOne(b => b.A)
        .Required()
        .HasForeignKey(b => b.AId);
    

    modelBuilder.Entity<B>()
        .HasOne(B => b.A)
        .Required()
        .WithMany(a => a.Bs)
        .HasForeignKey(b => b.AId);
    

    不是以上两个。

    当涉及到我从“1”端配置的一对多关系时,所以在这种情况下我会删除:

    modelBuilder.Entity<CorsoStepLezioneSessione>()
        .HasOne(sessione => sessione.Lezione)
        .WithMany(lezione => lezione.Sessioni)
        .HasForeignKey(sessione => new { sessione.codCorso, sessione.codStep, sessione.codLezione });
    

    ...只是保留在 CorsoStepLezione 一侧声明的关系。

    您需要在 CorsoStepLezioneSessione 上定义 PK:

    modelBuilder.Entity<CorsoStepLezioneSessione>()
        .HasKey(s => new s.codCorso, s.codStep, s.codLezione, s.codSessone });
    

    另一个建议:

    将导航属性声明为virtual,对于集合,将它们声明为virtual ICollection&lt;T&gt; 而不是List&lt;T&gt;。这有助于确保延迟加载和更改跟踪的 EF 代理可以有效地使用这些导航属性。

    我不确定双重映射是否会解释错误,似乎 EF 不认为 CorsoStepLezione 是有效的实体类型。如果您对此类使用任何继承或其他映射配置,这可能有助于解释该行为。

    【讨论】:

    • 我去查一下。感谢您的答复。我有这些关系:Corso 1 - 许多步骤,步骤 1 - 许多课程,第 1 课 - 许多会话。我打算从会议中吸取教训
    • 我已经采纳了您的建议,您可以查看stackoverflow.com/questions/66688230/…吗?
    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 2021-05-08
    • 2021-05-20
    • 2020-04-29
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多