0

3つの1..*関係を含む、いくつかの関係を含むエンティティ「LICENSE」を取得しました。後でエンティティを編集して再度保存できるようにするために、GUI+Managerに取り組んでいます。ボタンで保存イベントを呼び出すと、コントロールから値を読み取ることで、編集中のプリロードされたエンティティのプロパティと関係を上書きします。

新しく選択したエンティティに同じObjectContextをロードし、関係自体を上書きすることで、3つの関係を変更しています。3つのケースのうち2つでは、完全に機能します。最後のケースでも、関係は正常に変更され(別のエンティティが保存され)、保存プロセスは非常にうまく実行できます。ただし、3番目のケースでは、私には理解できない奇妙な動作があり、それを修正する方法もわかりません。

リレーションシップのエンティティを変更すると、LICENSEオブジェクトのIDが上書きされますが、これはまったく意味がありません。

コードは次のとおりです。

GUI:

private LICENSE lizenz { get; set; } // in the load event, this object will be filled correctly

private string form2obj() // this method is getting called in my button save event
{
    //...
    // I removed some conditions (they all successed on testing, so believe my controls are set right on testing this
    this.lizenz.ADRESSE_KONTAKTE_Lieferant = LizenzManager.LoadContact(Convert.ToInt32(this.ddLieferantAnsp.SelectedValue)); // ADRESSE_KONTAKTE_Lieferant is a 1..* relationship, this.ddLieferantAnsp.SelectedValue contains the ID of the object I want to load into the relationship
    this.lizenz.ADRESSE_KONTAKTE_Betreiber = LizenzManager.LoadContact(Convert.ToInt32(this.ddBetreiberAnsp.SelectedValue)); // ADRESSE_KONTAKTE_Betreiber is a 1..* relationship, this.ddBetreiberAnsp.SelectedValue contains the ID of the object I want to load into the relationship
    this.lizenz.DB_TYPES = LizenzManager.LoadDatabaseType(Convert.ToInt32(this.ddDatenbanktyp.SelectedValue)); // DB_TYPES is a 1..* relationship, too, this.ddDatenbanktyp.SelectedValue contains the ID of the object I want to load into the relationship
    // last line overwrites this.lizenz.ID with the value of Convert.ToInt32(this.ddDatenbanktyp.SelectedValue), this is wrong
    //...
}

BLL(LizenzManager):

// context is the same ObjectContext in all three calls!
//...
public static ADRESSE_KONTAKTE LoadContact(int id)
{
    return context.ADRESSE_KONTAKTE.Where(x => x.ID == id).Single(); // this seems to success
}

public static DB_TYPES LoadDatabaseType(int id)
{
    return context.DB_TYPES.Where(x => x.ID == id).Single(); // this works, but it overwrites the ID of my LICENSE object I load this into ...
}
//...

ご覧のとおり、ロード方法はほとんど同じで、両方のテーブルにID列がありますが、最後のリレーションにより、this.lizenz.IDがロードしたDB_TYPESエンティティのIDで上書きされます。

この問題を解決する方法を教えてください。

4

1 に答える 1

0

わかりました、これは非常に小さくて愚かな問題でした。

以前にSQLManagementStudioでリレーションシップを作成していたときに、LICENSEテーブルに正しい外部キーを設定するのを忘れていました。そのため、それはまだIDにあり、関係を変更するときにライセンスエンティティのIDを上書きすることを余儀なくされました。

この質問を読むために時間を割いてくれたすべての人々に感謝します。

于 2012-10-23T11:38:27.827 に答える