WCF / Entity Framework - Как получить хороший DataContract? - PullRequest
1 голос
/ 13 сентября 2011

Есть ли чистый способ использования автоматически сгенерированных классов EF с WCF вместо необходимости вручную создавать классы для WCF DataContracts? Классы находятся в LAIT.Entities.dll

ProductService.vb

Public Class ProductService Реализует IProductService

Public Function GetWorkOrder(ByVal WorkOrderID As Integer) As

WorkOrder реализует IProductService.GetWorkOrder

    Using dc As New LAIT.Model.LAITEntities
        Try
            Dim _Order = (From o In dc.WorkOrder
                           Where o.WorkOrderID = WorkOrderID
                          Select o).SingleOrDefault

            Return _Order
        Catch ex As Exception
            Return Nothing
        End Try
    End Using

End Function 

Конечный класс

IProductService.vb

Открытый интерфейс IProductService

<OperationContract()>
Function GetWorkOrder(ByVal WorkOrderID As Integer) As

LAIT.Entities.WorkOrder

Конечный интерфейс

Ответы [ 2 ]

2 голосов
/ 14 сентября 2011

Да.Для этого вам нужно отредактировать файл T4, который VS использует для автоматической генерации ваших сущностей.Все, что вам нужно сделать, это убедиться, что все ваши классы отмечены атрибутом <DataContract>, а ваши свойства отмечены атрибутом <DataMember>.Я предполагаю, что вы используете сущности POCO, потому что и Entity Objects, и STE уже помечены как DataContract, и вам не нужно ничего делать, чтобы использовать их в ваших службах WCF.

Сказав это, я настоятельно не рекомендую вам использовать Entity Objects по проводам с WCF.В этом сценарии вы должны использовать либо STE, либо POCO.

0 голосов
/ 23 сентября 2011

Тип прокси-сервера POCO не может быть напрямую сериализован или десериализован Windows Communication Foundation (WCF), поскольку механизм сериализации DataContractSerializer может сериализовать и десериализовать только известные типы.Тип прокси не является известным типом.

Если ваши сущности POCO не имеют каких-либо «свойств навигации», вы можете сериализовать объекты ваших сущностей через службы WCF, добавив <DataContract> and <DataMember> свойства в ваш класс.

Но для сущностей со «свойствами навигации» Помимо добавления <DataContract> and <DataMember> свойств в ваш класс, вам необходимо внести некоторые изменения в службу WCF следующим образом.Добавьте следующую команду в ваш проект службы WCF.

1.

Imports System.Data.Objects
Imports System.ServiceModel.Description
Imports System.ServiceModel.Channels

Public Class ApplyDataContractResolverAttribute
    Inherits Attribute
    Implements IOperationBehavior

    Public Sub New()
    End Sub

    Public Sub AddBindingParameters(ByVal operationDescription As OperationDescription, ByVal parameters As BindingParameterCollection) Implements IOperationBehavior.AddBindingParameters
    End Sub

    Public Sub ApplyClientBehavior(ByVal operationDescription As OperationDescription, ByVal proxy As System.ServiceModel.Dispatcher.ClientOperation) Implements IOperationBehavior.ApplyClientBehavior
        Dim dataContractSerializerOperationBehavior As DataContractSerializerOperationBehavior = operationDescription.Behaviors.Find(Of DataContractSerializerOperationBehavior)()
        dataContractSerializerOperationBehavior.DataContractResolver = New ProxyDataContractResolver()
    End Sub

    Public Sub ApplyDispatchBehavior(ByVal operationDescription As OperationDescription, ByVal dispatch As System.ServiceModel.Dispatcher.DispatchOperation) Implements IOperationBehavior.ApplyDispatchBehavior
        Dim dataContractSerializerOperationBehavior As DataContractSerializerOperationBehavior = operationDescription.Behaviors.Find(Of DataContractSerializerOperationBehavior)()
        dataContractSerializerOperationBehavior.DataContractResolver = New ProxyDataContractResolver()
    End Sub

    Public Sub Validate(ByVal operationDescription As OperationDescription) Implements IOperationBehavior.Validate
        ' Do validation.
    End Sub
End Class

2. Откройте файл интерфейса службы.По умолчанию он называется IService1.

3. Замените код, определяющий файл интерфейса службы, следующим кодом:

C#
[ServiceContract]
public interface IService1
{
    [OperationContract]
    [ApplyDataContractResolver]
    void UpdateOrder(Order updated);

    [OperationContract]
    [ApplyDataContractResolver]
    Order GetOrder(int OrderID);
}

VB
<ServiceContract> _
Public Interface IService1
    <OperationContract> _
    <ApplyDataContractResolver> _
    Sub UpdateOrder(updated As Order)

    <OperationContract> _
    <ApplyDataContractResolver> _
    Function GetOrder(OrderID As Integer) As Order
End Interface

И вы готовы к работе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...