Порядок членов данных отсутствует в сгенерированном прокси-классе клиента 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 {}
}
Другие вопросы по тегам