2

linq-to-sqlを使用してアプリケーションを引き継ぎ、データベースにいくつかの主要な変更を加える予定です。dbmlデザイナでモデルを更新するためのサポートがないため、代わりにsqlmetalを使用しようとしています。ただし、sqlmetalによって生成されたコードが、dbmlデザイナーによって生成されたcoldeと互換性がないという問題が発生しました。

別のテーブル(モデルなど)へのFKを持つテーブル(車など)がある場合、シリアル化は異なり、関連付け属性の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
}

sqlmetalを使用するときにModelプロパティをデータコントラクトの一部にする方法はありますか?

4

1 に答える 1

0

ラッパープロパティを使用することになりました。

[DataMember(Name="Model", Order=100)]
public Model ModelDataMember
{
    get
    {
        return Model;
    }
    set
    {
        if(value != null)
        {
            Model = value;
        }
    }
}

まず、クライアントがModelIDを設定したが、Model参照を設定しなかった場合、逆シリアル化で問題が発生しました。モデル参照が以前に設定されている場合、ModelIDセッターのSqlMetal生成コードは例外をスローします。これは、DataMember属性のOrderプロパティによって処理されます。これにより、ModelIDがModelの前に逆シリアル化されます。

ModelIDが設定されたときの逆シリアル化では、Model参照ではなく、Model参照セッターがModelIDをゼロにするため、それでも機能しませんでした。この動作は、dbmlデザイナーが生成したコードとは異なります。ModelIDプロパティをModelプロパティと同期するのはSqlMetalだけです。value解決策は、の場合はstterをスキップすることでしたnull

于 2011-03-16T10:25:23.413 に答える