我是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的已知类型列表。
我有几个项目正在解决。
Model
项目中实施)这是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)]
属性也无济于事。
是否可以将生成的实体用作数据合同?
答案 0 :(得分:2)
DynamicProxies表示您正在使用延迟加载,并且当WCF尝试序列化对象时,上下文被关闭可能会导致错误。
尝试禁用延迟加载并改为使用预先加载。
答案 1 :(得分:0)
您应该将Person对象映射到数据传输对象或Poco对象。您可以相应地使用DataMember属性来装饰这些属性。如果你必须禁用延迟加载,你将失去ORM的好处,并且将对你甚至可能不使用的数据运行查询 - 在小型系统中可能不是一个大问题,但随着系统的增长,它可能会使它们瘫痪。