2015-06-04 43 views
0

我面临以下问题:我有ProductOrder类ProductId作为产品类的外键。当我调用下面的方法:WCF + EF返回对象与FK

public IEnumerable<ProductOrder> GetOrders() 
{ 
     return OddzialDb.ProductOrders; 
} 

订单与产品相关的,所以我可以写这样的事:

OddzialDb.ProductOrders.First().Product.Name; 

,但是当它到达客户原来存在与产品没有关联这是null(仅包含ProductId)。看起来的DbContext我已经设置

base.Configuration.ProxyCreationEnabled = false; 
    base.Configuration.LazyLoadingEnabled = false; 

在WCF服务端通过EF ProductOrder自动生成的类,如下所示:

public partial class ProductOrder 
    { 
     public int Id { get; set; } 
     public Nullable<int> ProductId { get; set; } 
     public int Quantity { get; set; } 

     public virtual Product Product { get; set; } 
    } 

会发生什么,它失去与外键关联的表连接?

+0

尝试OddzialDb.ProductOrders.Include(PO => po.Product)。首先()Product.Name。 –

+0

我收到循环参考。 – Maximus

+0

您可能需要在序列化之前预测结果。 http://stackoverflow.com/questions/2107535/how-to-remove-circular-reference-in-entity-framework –

回答

0

让您关系虚拟如示例:

public class ProductOrder 
{ 
    public int Id { get; set; } 
    public virtual Product Product { get; set; } 
    public int ProductId { get; set; } 
} 

通过转动你的关系virtual,实体框架将生成您ProductOrder类的代理将包含Product的参考。

,以确保它会工作,Product还必须包含对ProductOrder参考:

public class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<ProductOrder> ProductOrders { get; set; } 
} 

设置这些变量在您DbContext真:

Configuration.LazyLoadingEnabled = true; 
Configuration.ProxyCreationEnabled = true; 

在您WCF应用程序,添加以下班级,这将允许代理序列化

public class ApplyDataContractResolverAttribute : Attribute, IOperationBehavior 
{ 
    public ApplyDataContractResolverAttribute() 
    { 
    } 

    public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters) 
    { 
    } 

    public void ApplyClientBehavior(OperationDescription description, System.ServiceModel.Dispatcher.ClientOperation proxy) 
    { 
     DataContractSerializerOperationBehavior dataContractSerializerOperationBehavior = 
      description.Behaviors.Find<DataContractSerializerOperationBehavior>(); 
     dataContractSerializerOperationBehavior.DataContractResolver = 
      new ProxyDataContractResolver(); 
    } 

    public void ApplyDispatchBehavior(OperationDescription description, System.ServiceModel.Dispatcher.DispatchOperation dispatch) 
    { 
     DataContractSerializerOperationBehavior dataContractSerializerOperationBehavior = 
      description.Behaviors.Find<DataContractSerializerOperationBehavior>(); 
     dataContractSerializerOperationBehavior.DataContractResolver = 
      new ProxyDataContractResolver(); 
    } 

    public void Validate(OperationDescription description) 
    { 
     // Do validation. 
    } 
} 

然后在你的ServiceContract接口您添加DataAnnotation[ApplyDataContractResolver]中的其他注释,如[OperationContract]右侧,上方返回一个实体的任何方法签名:

[OperationContract] 
[ApplyDataContractResolver] 
[FaultContract(typeof(AtcWcfEntryNotFoundException))] 
Case GetSingleByCaseNumber(int number); 
+0

我已经试过包括,在这种情况下,我收到循环引用错误。当客户端使用WCF服务时,它具有自动生成的类,如产品等。 – Maximus

+0

使用'WCF',第二种方法会更好。我从来没有使自己的方式正常工作。 –

+0

就带有EF的WCF服务而言,产品和ProductOrders通过虚拟关键字互相引用。 – Maximus