Порядок членов данных отсутствует в сгенерированном прокси-классе клиента wcf
Сопоставили таблицу из базы данных sql с linq в dbml-файле Employee.
[global::System.Runtime.Serialization.DataContractAttribute()]
public partial class tbEmployee
{
private int _Employeeid;
private string _EmployeeName;
public tbEmployee()
{
}
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "_Employeeid", DbType = "Int NOT NULL")]
[global::System.Runtime.Serialization.DataMemberAttribute(Order = 0)]
public int EmployeeID
{
get
{
return this._PeriodContextRefId;
}
set
{
if ((this._Employeeid != value))
{
this._Employeeid = value;
}
}
}
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "_EmployeeName", DbType = "NVarChar(2) NOT NULL", CanBeNull = false)]
[global::System.Runtime.Serialization.DataMemberAttribute(Order = 1)]
public string EmployeeName
{
get
{
return this._EmployeeName;
}
set
{
if ((this._EmployeeName != value))
{
this._EmployeeName = value;
}
}
}
}
и в сервисе я просто возвращаю объект типа
List<tbEmployee>
когда я добавляю ссылку на сервис в моем клиенте, информация о заказе члена даты пропускается.
так как я использую protobuf-net для сериализации / десериализации, это создает проблему при десериализации на стороне клиента.
1 ответ
Да, это неприятность. Есть 2 варианта исправить это; Первое (и самое простое) - использовать способность WCF делиться сборкой контракта между клиентом и сервером. Если вы сможете поделиться слоем DTO, все будет просто.
Во-вторых, добавить дополнительные маркеры на клиенте, чтобы дать ему подсказку. Вы можете сделать это через partial
класс, например, в отдельном кодовом файле (не редактируйте сгенерированный файл):
namespace YourNamespace {
[ProtoContract(DataMemberOffset = 1)] /* shift all DataMember orders */
public partial class tbEmployee {}
}
более явная альтернатива:
namespace YourNamespace {
[ProtoPartialMember(1, "EmployeeID")]
[ProtoPartialMember(2, "EmployeeName")]
public partial class tbEmployee {}
}