实体框架6如何实现内部联接

本文关键字:实现 内部 框架 何实现 实体 | 更新日期: 2023-09-27 18:28:03

我定义了以下两个类:

 public class tblInstrument
 {
     [Key]
     public int InstrumentID { get; set; }
     public int MarketID { get; set; }
     public virtual tblMarket tblMarket { get; set; }
 }

[Table("tblMarket")]
public class tblMarket
{
    public tblMarket()
    {
        tblInstruments = new HashSet<tblInstruments>();
    }
    [Key]
    public int MarketID { get; set; }
    [Required]
    [StringLength(10)]
    public string Market { get; set; }
    public virtual ICollection<tblInstruments> tblInstruments { get; set; }
}

我想知道为什么以下代码在附加到tblInstrument类时不起作用:

    [NotMapped]
    public string FullInstrumentName
    {
        get { return string.Format("{0}", tblMarket.Market.Trim(); }
    }

当我在其上放置断点时,我看到tblmarket为null,但它是虚拟的,这意味着它是"惰性加载的",这可能就是它为null的原因,但FullInstrumentName属性不会返回tblmarkets的预期Market属性(字符串)。有人能帮我理解Entity是如何加入的吗?

谢谢-Ed

实体框架6如何实现内部联接

默认情况下,此关系将是Lazy Loaded,当您需要使用FullInstrumentName属性时,您需要为特定场景覆盖该行为:

DbContext.tblInstruments
    .Include( i => i.tblMarket )
    .Where( i.MarketID == xyz );

若要使用Include,您需要导入System.Data.Entity命名空间。

作为一种选择,如果你发现你将更频繁地使用该属性,那么你可能会考虑为该关系完全删除懒惰负载,但这是你需要仔细考虑的利弊。

EF希望您向他展示如何与表建立关系,因此您需要映射tblMarket的外键,请参见映射:

 public class tblInstrument
 {
     [Key]
     public int InstrumentID { get; set; }
     public int MarketID { get; set; }
     [ForeignKey("MarketID")]
     public virtual tblMarket tblMarket { get; set; }
 }

因此EF将MarketIDtblMarket 的主键进行映射

我的问题是没有使用.include()方法来包含引用的表。因此,在上面的例子中,当我要求Entity检索Instrument表时,我也需要.include(a=>a.tblmarket)。

-Ed