最近在做ria+siverlight 的项目,遇到了很多无解的问题。实在头疼不已,思量再三还是改一下懒惰的习性,写篇文章记录一下。如果有哪位世外高人能路过此地,指点一二,就更感激不尽了。。闲话少说,上问题。。
问题描述:在服务端自定义了一个与数据无关联的实体类,并通过方法进行这个实体类的返回。编译Service.Web端没有问题,但是在编译Service时出问题了。。报错大致如下:'返回类型必须是实体或复杂类型、复杂类型的集合或预定义的可序列化类型之一',网上找了头天,但是实在找不出解决的办法。最后稀里糊涂的碰对了,但还是没弄明白。。
实体类的代码:
[MetadataTypeAttribute(typeof(Unit.UnitMetadata))]
[DataContractAttribute(IsReference=true)]
[Serializable]
public partial class Unit
{
/// <summary>
/// 主键
/// </summary>
[Key]
[DataMember]
public string ID { get; set; }
[DataMember]
public string Member1 { get; set; }
internal sealed class UnitMetadata
{
private UnitMetadata()
{
}
public string ID { get; set; }
public string Member1 { get; set; }
}
}
代码:
public partial class DomainSvcViolation
{
//[Invoke]
//public Unit QueryUnitInfo(string ID,string Member1)
//{
// return new Unit()
// {
// ID="123",
// Member1="test",
//};
//return this.GetVehInfo(plate_nbr, plate_type);
//}
[Invoke]
public Unit Test()
{
return new Unit() { ID = "123" };
}
}
加DataMember的时侯报错,‘‘被标记为属性,但该属性不可序列化。是否缺少DataMemberAttribute?’’后来加了DataMember属性以后就可以编译通过了。
但是当我再添加这个QueryUnitInfo的时侯,又报那个可恶的错误了。如下:
public partial class DomainSvcViolation
{
[Invoke]
public Unit QueryUnitInfo(object[] paras)
{
return new Unit()
{
ID="123",
Member1="test",
};
return this.GetVehInfo(plate_nbr, plate_type);
}
[Invoke]
public Unit Test()
{
return new Unit() { ID = "123" };
}
}
方式使用会报错,'返回类型必须是实体或复杂类型、复杂类型的集合或预定义的可序列化类型之一'.
再改一下,可以了。。。。代码如下:
public partial class DomainSvcViolation
{
[Invoke]
public Unit QueryUnitInfo(string Id)
{
return new Unit()
{
ID="123",
Member1="test",
};
return this.GetVehInfo(plate_nbr, plate_type);
}
[Invoke]
public Unit Test()
{
return new Unit() { ID = "123" };
}
}
你们看出来差别了吗?。。。。
补充:
public int SetOprtInRole(List<T_ASSO_ROLE_OPER> lstOprt, int roleId);如此方法签名会报同样的错误。
public int SetOprtInRole(List<string> lstOprt, int roleId);如此则可以了。
备注:这个签名在有的同事机器上是可以编译通过的。另,T_ASSO_ROLE_OPER是服务端的类。