2013-12-17 37 views
1

我正在使用WCF和实体框架的项目上工作。 因为WCF不会与动态代理,从here拍摄工作,我已经把这个线在我的上下文类的构造函数:关闭代理导致无关联

public CarBatteryEntities() : base("name=CarBatteryEntities") 
{ 
    base.Configuration.ProxyCreationEnabled = false; 
} 

WCF的作品,但我的LINQ查询不会返回他们的协会。

这是我的代码:

List<Edge> edges = edgeRepository.GetBatteryCenterEdges("cityname").ToList(); 
foreach(var e in edges) 
    Console.WriteLine(e); 

Edge有3个主要变量 - BatteryStationBatteryStationdistance。 它是ET的一个自动生成的类,两个BatteryStation都连接到另一个表。

如果我使用ProxyCreationEnabled作为true一切正常的魅力。

如果我使用ProxyCreationEnabledfalsedistance会正确地返回和两个对象(BatteryStationBatteryStation1)将null

有什么建议吗?

public IList<Edge> GetBatteryCenterEdges(string name) 
{ 
    var query = context.Edge 
         .Where(edge => edge.BatteryStation.name.Equals(name) 
            || edge.BatteryStation1.name.Equals(name)) 
         .AsEnumerable() 
         .SelectMany(edge => new[] { 
          edge, 
          new Edge() { 
           BatteryStation = edge.BatteryStation1, 
           BatteryStation1 = edge.BatteryStation, 
           distance = edge.distance 
          } 
         }); 

    return query.ToList(); 
} 
+1

你能列出'GetBatteryCenterEdges'的来源吗? – sinelaw

+0

我已将它添加到 – Nikola

回答

1

既然你已经关闭的代理,你可能需要使用Include()加载关联。

1

使用Include()进行预先加载:

using System.Data.Entity; // for Include extension method. 

var results = ctx.Edges 
    .Include(e => e.BatteryStation) 
    .Include(e => e.BatteryStation1) 
    .ToList(); 

或者对每个实体进行明确加载:

var results = ctx.Edges.ToList(); 

foreach(var e in results) 
{ 
    ctx.Entry(e).Reference(x => x.BatteryStation).Load(); 
    ctx.Entry(e).Reference(x => x.BatteryStation1).Load(); 
} 
+0

在'Include(e => e.BatteryStation)'上,它返回一个错误信息,说“不能将lambda表达式转换为字符串类型” – Nikola

+0

这是System.Data.Entity中的扩展方法。一个接受一个字符串,因为它可以重构,如果其中一个属性丢失,将导致编译时错误。 –

0

你可以做到这一点作为一个扩展方法如下。它是通用的方法包括:任何有关系的实体,你也可以通过使用返回导航属性的表达式来为任意数量的包含做同样的事情,以便使用预先加载的方式。

public IQueryable<TEntity> GetAllIncluding(params Expression<Func<TEntity, object>>[] includeProperties) 
{ 
    IQueryable<TEntity> queryable = GetAll(); 
    foreach (Expression<Func<TEntity, object>> includeProperty in includeProperties) 
    { 
     queryable = queryable.Include<TEntity, object>(includeProperty); 
    } 

    return queryable; 
}