我正在尝试使用返回自定义类型的ServiceMethod构建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 :(得分:0)
问题通过解决方法解决了:
我在modell中添加了3种复杂类型,匹配每个结果集的数据结构。 此外,我在数据上下文之外添加了一个容器类,它使用复杂类型将数据保存在一个对象中。 我使用自定义方法扩展了上下文类,以处理存储过程调用并将结果映射到适当的复杂类型.ObjectContext.Translate帮助很多... WCF数据服务类使用虚拟DataContext进行实例化。这为我的自定义数据容器类启用了元数据创建,现在可以将其用作自定义WCF数据服务方法的返回类型。 调用方法时会实例化数据上下文。
数据容器类`公共类BrfPackageDataContainer { public Guid TransactionId { 得到; 组; }
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 { public virtual BrfPackageDataContainer GetBrfPackage(int?crewId,string operatorCode,string departure,int?flightId,DateTime?stdRangeStart, 约会时间? stdRangeEnd,string requesApplication,string requesComputerName, string requesACReg,ref guid transactionId,int? specificInfoTypeId,byte?详细程度, 布尔? 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;
}
}