2015-06-04 76 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