Поведение [DataMember] в sqlmetal отличается от поведения в конструкторе dbml - PullRequest
2 голосов
/ 10 марта 2011

Я взял на себя приложение, использующее linq-to-sql, и теперь планирую внести некоторые существенные изменения в базу данных. Из-за отсутствия поддержки обновления модели в конструкторе dbml я пытаюсь использовать sqlmetal. Однако я столкнулся с проблемами с кодом, сгенерированным sqlmetal, который не совместим с colde, сгенерированным конструктором dbml.

Если у меня есть таблица (например, Car), в которой есть FK в другой таблице (например, Model), то сериализация будет отличаться, она не будет генерировать атрибут DataMember для атрибута ассоциации:

// **************************
// *** Dbml designer code ***
// **************************

[ColumnAttribute(...)]
[DatamemberAttribute(...)]
public int ModelID
{
    // property get and set
}

[AssociationAttribute(...)]
[DataMemberAttribute(...)]
public Model Model
{
    // property get and set
}

// **********************
// *** Sqlmetal code ****
// **********************

[ColumnAttribute(...)]
[DatamemberAttribute(...)]
public int ModelID
{
    // property get and set
}

[AssociationAttribute(...)]
// No DataMember attribute 
public Model Model
{
    // property get and set
}

Есть ли способ обойти это, чтобы свойство Model было частью контракта с данными при использовании sqlmetal?

1 Ответ

0 голосов
/ 16 марта 2011

Я использовал свойство оболочки:

[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.

...