【问题标题】:Losing connection when returning entity with navigational properties using Include(...)使用 Include(...) 返回具有导航属性的实体时失去连接
【发布时间】:2016-03-31 12:47:16
【问题描述】:

经过大量挖掘和混淆错误消息后,我得到了这个示例(我相信这是重现该问题的最小示例)。我几乎可以肯定地得出结论,问题的出现是由于与我要返回的实体相关联。

[OperationContract]
[WebGet(UriTemplate = "Stations")]
List<Station> GetStations();

public List<Station> GetStations()
{
  List<Station> stations = new List<Station>();
  using (Context context = new Context())
    foreach (Station station in context.Stations.Include(element => element.Records))
      //stations.Add(station.Copy());
      stations.Add(station);

  return stations;
}

如果我用 Copy() 激活该行(它会创建一个新的站实例并复制除它自己创建的记录之外的所有属性),它就会起作用。但是,当我只添加电台而不创建副本时(无论我是保留记录、将它们无效还是设置为空列表),它都不能很好地滚动。

自从我使用了Include(),被处理的对象就不再是问题了。我在控制台中收到的错误消息是这样的。

http://localhost:25760/MyService.svc/Stationsnet::ERR_CONNECTION_RESET

谷歌搜索给了我很多关于 Apache(我在 IIS 上运行它)、PHP(我在 .NET 上构建它)和证书安全问题(我没有使用任何其他调用)的引用工作得很好)。

所以我怀疑错误消息是来自混乱的计算机,或者是我在设置中遗漏了一些东西。自动生成的类反映了我添加到表中的外键,如下所示。

alter table Records 
add constraint FkStationId 
foreign key (StationId) 
references Stations (Id)

public partial class Record
{
  public System.Guid Id { get; set; }
  public Nullable<System.Guid> StationId { get; set; }
  ...
  public virtual Station Station { get; set; }
}

public partial class Station
{
  [System.Diagnostics.CodeAnalysis.SuppressMessage(
    "Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
  public Station() { this.Records = new HashSet<Record>(); }
  public System.Guid Id { get; set; }
  ...
  [System.Diagnostics.CodeAnalysis.SuppressMessage(
    "Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
  public virtual ICollection<Record> Records { get; set; }
}

我没有看到任何东西让我想到如何解决它。这个错误不应该发生。另一方面——福岛也不应该发生。但确实如此。

【问题讨论】:

    标签: c# entity-framework iis include


    【解决方案1】:

    我终于把它运行起来了。

    1. 关闭代理创建。
    2. 关闭延迟加载。
    3. 使虚拟属性对序列化是可忽略的。
    4. 显式加载链接的实体。

    前两项在上下文的构造函数中完成。

    public partial class Context : DbContext
    {
      public Context() : base("name=ContextConnection")
      {
        Configuration.LazyLoadingEnabled = false;
        Configuration.ProxyCreationEnabled = false;
      }
      ...
    }
    

    第三个是通过将导致循环依赖的虚拟属性之一归因于对序列化无效。

    public partial class Station
    {
      ...
      [IgnoreDataMemeber]
      public virtual ICollection<Record> Records { get; set; }
    }
    

    最后一个是包含或省略要显示(或不显示)的导航属性。在这种情况下,将有关电台的信息塞进每条记录是有意义的。不过,这些电台可以在没有记录的情况下呈现。

    public List<Station> GetStations()
    {
      using (Context context = new Context())
        return context.Stations
          .ToList();
    }
    
    public List<Record> GetRecords()
    {
      using (Context context = new Context())
        return context.Records
          .Include(record => record.Station)
          .ToList();
    }
    

    话虽如此,会有龙。这种方法会导致大量工作,因为它需要在每次重新创建自动生成的文件时手动重新编辑它们。所以我选择了 Code First。

    【讨论】:

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