Я использовал свойство оболочки:
[DataMember(Name="Model", Order=100)]
public Model ModelDataMember
{
get
{
return Model;
}
set
{
if(value != null)
{
Model = value;
}
}
}
Во-первых, у меня были проблемы с десериализацией, когда клиент установил ModelID, но не ссылку на модель. Код, сгенерированный SqlMetal для установщика ModelID, выдаст исключение, если ссылка на модель была ранее установлена. Это обрабатывается свойством Order атрибута DataMember, который обеспечивает десериализацию ModelID перед Model.
Это все еще не работало, потому что теперь при десериализации, когда был задан ModelID, а не ссылка на модель, установщик ссылки на модель обнулит ModelID. Это поведение отличается от кода, сгенерированного дизайнером dbml, только SqlMetal синхронизирует свойство ModelID со свойством Model. Решением было пропустить статер, если value
равно null
.