По сути, это проблема сериализации.Я имел эту проблему в моем коде в прошлом, но это было какое-то время, так что терпите меня.
Во-первых, мы должны выяснить, являются ли объектные отношения нулевыми, перед вызовом WCF, поэтому поставьтеотладка до и после.
Если объект возвращается как нулевой до вызова, у вас есть несколько вариантов:
Вы можете явно использовать .Include ("AnotherObject") в вашем DbContext, чтобы получить объект.Я использовал это, когда мой метод Read взял массив строк, которые я использовал для включения всех необходимых объектов.Это идеальнее, чем автоматическое получение всех объектов, потому что во время сериализации, если вы берете все, вы можете легко завершить сериализацию всей базы данных, что, помимо прочего, приводит к проблемам с производительностью и безопасностью.
Другой вариант - использовать динамический прокси, добавив ключевое слово virtual перед вашим списком.Однако DataContractSerializer имеет проблему с сериализацией динамических прокси, поэтому вам нужно реализовать атрибут, который использует ProxyDataContractResolver вместо DataContractResolver.Этот атрибут должен применяться ко всем OperationContracts, которые могут передавать динамический прокси.Это автоматически примет ВСЕ ссылки на объекты, что, вероятно, является плохой практикой кодирования, поэтому я рекомендую описанный выше метод.
public class ApplyDataContractResolverAttribute : Attribute, IOperationBehavior
{
public ApplyDataContractResolverAttribute() { }
public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters) { }
public void ApplyClientBehavior(OperationDescription description, System.ServiceModel.Dispatcher.ClientOperation proxy)
{
DataContractSerializerOperationBehavior dataContractSerializerOperationBehavior = description.Behaviors.Find<DataContractSerializerOperationBehavior>();
dataContractSerializerOperationBehavior.DataContractResolver = new ProxyDataContractResolver();
}
public void ApplyDispatchBehavior(OperationDescription description, System.ServiceModel.Dispatcher.DispatchOperation dispatch)
{
DataContractSerializerOperationBehavior dataContractSerializerOperationBehavior = description.Behaviors.Find<DataContractSerializerOperationBehavior>();
dataContractSerializerOperationBehavior.DataContractResolver = new ProxyDataContractResolver();
}
public void Validate(OperationDescription description) { }
}
Редактировать: Также я думаю, что вы можете иметь сеттеры в контрактах данныхне быть публичным, потому что я делаю это, и это прекрасно работает :).Но я бы попытался сначала сделать ваш установщик открытым, затем решить проблему, а затем вернуться к защищенному установщику, чтобы вы имели дело с как можно меньшим количеством переменных за раз.