基于EF5模型的WCF数据服务;如何添加自定义类型

时间:2013-01-24 17:42:16

标签: entity-framework wcf service

我正在尝试使用返回自定义类型的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模型作为数据源并仍然使用我的自定义类型作为我的方法的返回值。

1 个答案:

答案 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;
        }
    }