【发布时间】:2012-11-06 18:44:26
【问题描述】:
我是 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)
- 控制台应用程序(调用 WCF 项目或 WPF 应用程序中托管的服务)
这是 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)] 属性也没有帮助。
是否可以将生成的实体用作数据合约?
【问题讨论】:
标签: c# wcf serialization datacontract