2013-01-24 27 views
1

我正在嘗試使用返回自定義類型的ServiceMethod構建WCF數據服務。 此類型用作一次傳輸多個數據集的容器。我無法將此類型定義爲實體或複雜類型。基於EF5模型的WCF數據服務;如何添加自定義類型

public class BrfPackageDataContainer { 
    public ICollection<BrfFlight> Flights { 
    get; 
    set; 
    } 

    public ICollection<BrfFlight_Info> Flight_Infos { 
    get; 
    set; 
    } 

    public ICollection<BrfInfo> Infos { 
    get; 
    set; 
    } 

    public BrfPackageDataContainer() { 
    this.Flights = new List<BrfFlight>(); 
    this.Flight_Infos = new List<BrfFlight_Info>(); 
    this.Infos = new List<BrfInfo>(); 
    } 
} 

這是我ServiceMethod聲明:

[WebGet] 
    [SingleResult] 
    public FlightInfoEntities.BrfPackageDataContainer GetBrfPackage() { 
     var brfPackageDataContainer = new FlightInfoEntities.BrfPackageDataContainer(); 
     brfPackageDataContainer.Demodata(); 
     return brfPackageDataContainer; 
    } 

我使用空虛擬的DataService作爲服務類定義數據源時,得到這個運行。但是,當我使用我的實體框架模型作爲數據源時,服務拒絕啓動,因爲缺少自定義類型的元數據。 我的問題是: 如何使用EF模型作爲數據源並仍然使用我的自定義類型作爲我的方法的返回值。

+0

我不認爲這是可能的。使用實體框架時,只能使用EF模型中定義的類型,並且不能將自定義類型添加到模型中。如果複雜類型對您來說足夠了,您可以嘗試向您的EF模型中添加一個虛擬複合類型,EF不會使用它,但您會使用它(注意 - 我沒有嘗試過)。 – Pawel

回答

0

問題的一種解決方法解決:

我加入3-複雜類型到我的潛行,匹配每個單獨的結果集的數據結構。 此外,我在數據上下文之外添加了一個容器類,它使用複雜類型將數據保存在一個對象中。 我使用自定義方法擴展了上下文類,以處理存儲過程調用並將結果映射到相應的複雜類型.ObjectContext.Translate幫助了很多... WCF數據服務類使用虛擬DataContext實例化。這可以爲我的自定義數據容器類創建元數據,該類現在可以用作自定義WCF數據服務方法的返回類型。 當方法被調用時,數據上下文被實例化。

數據容器類`公共類BrfPackageDataContainer {公共Guid TransactionId {0} {0} {0} {0} 集; }

public List<BrfFlight> Flights { 
     get; 
     set; 
    } 

    public List<BrfFlight_Info> Flight_Infos { 
     get; 
     set; 
    } 

    public List<BrfInfo> Infos { 
     get; 
     set; 
    } 

    public BrfPackageDataContainer() { 
     this.Flights = new List<BrfFlight>(); 
     this.Flight_Infos = new List<BrfFlight_Info>(); 
     this.Infos = new List<BrfInfo>(); 
    } 
}` 

上下文擴展名:???? 公共部分類FlightInfoEntities { 公共虛擬BrfPackageDataContainer GetBrfPackage(INT crewId,串operatorCode,串出發,INT FLIGHTID,日期時間stdRangeStart, 日期時間stdRangeEnd,串requestingApplication ,字符串requestsComputerName, string requestedACReg,ref Guid transactionId,int?specificInfoTypeId,byte?levelOfDetail, bool?skipLog){ using(DbCommand command = this.Database.Connection.CreateCommand()){ command.CommandType = CommandType.StoredProcedure; command.CommandText =「[dbo]。[GetBrfPackage]」;

  ... 

      var dataContainer = new BrfPackageDataContainer(); 

      try { 
       this.Database.Connection.Open(); 

       using (DbDataReader reader = command.ExecuteReader()) { 
        dataContainer.Flights = ((IObjectContextAdapter)this).ObjectContext.Translate<BrfFlight>(reader).ToList(); 
        reader.NextResult(); 
        dataContainer.Flight_Infos = ((IObjectContextAdapter)this).ObjectContext.Translate<BrfFlight_Info>(reader).ToList(); 
        reader.NextResult(); 
        dataContainer.Infos = ((IObjectContextAdapter)this).ObjectContext.Translate<BrfInfo>(reader).ToList(); 
       } 
       return dataContainer; 
      } catch (Exception ex) { 
       throw ex; 
      } 
     } 

WCF數據服務方法:

[WebGet] 
    [SingleResult] 
    public BrfPackageDataContainer GetBrfPackage() { 
     using (var brfCtx = new FlightInfoEntities()) { 
      Guid transactionId = new Guid(); 
      var brfPackageDataContainer = brfCtx.GetBrfPackage(null,"4T",null,null,null,null,"test",Environment.MachineName,null,ref transactionId,null,3,false); 
      return brfPackageDataContainer; 
     } 
    } 
相關問題