WCF - 实体框架,生成实体序列化错误

时间:2012-11-06 18:44:26

标签: c# wcf serialization datacontract

我是WCF的新手,今天我遇到了DataContracts的问题。当对象从WCF服务返回到客户端时,我遇到异常。

SvcTraceViewer显示下一个异常:

  

类型   'System.Data.Entity.DynamicProxies.Person_7C797A477DD73534D4E8E743E1FCC1C75DAB75933D03B845A097A8B83F2DD748'   包含数据合同名称   'Person_7C797A477DD73534D4E8E743E1FCC1C75DAB75933D03B845A097A8B83F2DD748:HTTP://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies'   不是预期的。考虑使用DataContractResolver或添加任何   静态地知道已知类型列表的类型 - 例如,   通过使用KnownTypeAttribute属性或将它们添加到   传递给DataContractSerializer的已知类型列表。

我有几个项目正在解决。

  • DataAccess(EntityFramework EDMX文件放在此处)
  • 模型(由DbContextGenerator生成的实体在这里)
  • WCF服务(DataContracts在Model项目中实施)
  • WPF应用程序(运行ServiceHost)
  • 控制台应用程序(调用WPF应用程序中托管的WCF项目或服务)

这是WCF中的操作合同:

[OperationContract]
Person[] GetAllPersons(int version);

接口实现:

public Person[] GetAllPersons(int version)
{
    return StorageService.GetAllPersons(version);
}

在客户端(ConsoleApp)收到数据时抛出异常。

我猜这个问题与生成的实体有关,因为它们是部分类

这是Person类:

public partial class Person
{
    public Person()
    {
        this.Project = new HashSet<Project>();
    }

    public int Id { get; set; }
    public Nullable<long> AddressId { get; set; }
    public string LastName { get; set; }
    public string MiddleName { get; set; }
    public string FirstName { get; set; }
    public Nullable<long> GeoLocationId { get; set; }
    public string FullGeoLocationName { get; set; }
    public Nullable<long> SupervisorId { get; set; }
    public Nullable<long> PositionId { get; set; }
    public string Position { get; set; }
    public string Office { get; set; }
    public string NativeName { get; set; }
    public string Location { get; set; }
    public string FullName { get; set; }
    public Nullable<long> PmcPersonId { get; set; }

    public virtual ICollection<Project> Project { get; set; }
    public virtual PersonDataVersion DataVersion { get; set; }
    public virtual Workspace Workspace { get; set; }
}

我尝试使用[DataContract][DataMember]属性标记类及其成员,但错误仍然存​​在。 [KnownType(typeof(Person)]属性也无济于事。

是否可以将生成的实体用作数据合同?

2 个答案:

答案 0 :(得分:2)

DynamicProxies表示您正在使用延迟加载,并且当WCF尝试序列化对象时,上下文被关闭可能会导致错误。

尝试禁用延迟加载并改为使用预先加载。

答案 1 :(得分:0)

您应该将Person对象映射到数据传输对象或Poco对象。您可以相应地使用DataMember属性来装饰这些属性。如果你必须禁用延迟加载,你将失去ORM的好处,并且将对你甚至可能不使用的数据运行查询 - 在小型系统中可能不是一个大问题,但随着系统的增长,它可能会使它们瘫痪。