2012-11-06 39 views
1

我是新来的WCF,今天我遇到了DataContracts的问题。当对象从WCF服务返回给客户端时,我收到异常。WCF - 实体框架,生成的实体序列化错误

SvcTraceViewer显示了一个异常:

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

我在解决方案中有几个项目。

  • 数据访问(的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)收到的excepion被抛出。

我猜是因为他们是局部类

这里的问题是关系到生成的实体,是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

DynamicProxies表明您正在使用延迟加载,并且错误可能是由WCF尝试序列化对象时上下文被关闭引起的。

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

+5

禁用LazyLoading没有帮助,但禁用代理运行良好'con.Configuration.ProxyCreationEnabled = false;'谢谢 – opewix

0

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