【问题标题】:MySQl Entity Framework C# Foreign Key Data Load Delay ErrorMySQl 实体框架 C# 外键数据加载延迟错误
【发布时间】:2017-11-22 05:59:57
【问题描述】:

我有两个实体类如下:

public class Stock
{
    public int Id { get; set; }

    public string ShortName { get; set; }
    public string SecId { get; set; }
    public double? LastClearPrice { get; set; } 
    public double? Garant { get; set; }  
    public DateTime? EndDate { get; set; }

    public IList<Position> Positions { get; set; }

}

public class Position
{

    public int Id { get; set; }

    public Stock Stock { get; set; } //virtual for lazy loading
    public int StockId { get; set; }

    public DateTime OpenDate { get; set; }
    public double OpenPrice { get; set; }

    public DateTime? CloseDate { get; set; }
    public double? ClosePrice { get; set; }

    public int Size { get; set; }

}

我正在做这样的查询:

    IQueryable<Position> GetAllPositions()
    {
        _context = new StockWatcherContext();
        var getAllPos = _context.Positions.Select(x => x);

        return getAllPos;
    }

但是,getALLPos 对象中的 Stock 字段返回 null。现在,这很奇怪,但当我开始调试并添加类似这样的东西时也是如此

var getAllStocks = _context.Stocks.Select(x => x);

在我以调试模式打开 getAllStocks 对象的属性后,getAllPos 对象的 Stock 字段也被数据填充。我不知道从这里搬到哪里以及为什么会这样。有任何想法吗?谢谢。

【问题讨论】:

  • 我只看到一个班级和它的样子,另一个班级的一半......
  • 我在发布这个问题时漏掉了一行。对不起。现在修复它...

标签: c# mysql entity-framework linq linq-to-sql


【解决方案1】:

最终修复:

public virtual Stock Stock { get; set; } 

Stock 类中延迟加载的虚拟。

将方法返回类型更改为List。

List<Position> GetAllPositions()
    {
        _context = new StockWatcherContext();
        var getAllPos = _context.Positions.Select(x => x).ToList();
        return getAllPos;
    }

【讨论】:

    【解决方案2】:

    您的“Stock”属性未标记为虚拟(与评论相反),因此 EF 的惰性代理无效。加载 Stocks 后,EF 可以解析先前加载的 Position 类的股票引用。

    您的股票头寸也是如此。对于延迟加载,您需要将它们标记为虚拟,以便 EF 可以放入代理来管理回调以根据请求加载它们。如果没有虚拟,如果 EF 不“知道”它们,它将使它们为空。 (渴望加载,或先前加载到上下文中。)

    【讨论】:

    • 成功了!还将调用方法的返回类型更改为 List 否则会得到一个 MySqlException:已经有一个与此 Connection 关联的打开的 DataReader 必须先关闭。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多