0

Person という名前のエンティティと、Car という名前のエンティティがあり、すべての車を 1 人だけが所有できます。人物は、Ef を介して DB から取得されます。次に、プロパティがいくつかのコントロールにバインドされているWPFグリッドにデータコンテキストとして人物を設定しています。とても良いです。グリッド内には、Person オブジェクトからの itemssource として直接バインドすることで CarCollestion を表示する itemscontrols があります。プレゼンテーションは完璧に機能します。車を選択して編集すると、車のオブジェクトが変更を受け入れます。人を救う上で、車のコレクションも救いたいと思います。その人物を新しいコンテキストに関連付け、人物のオブジェクトの状態を変更済みに変更し、savechanges を押します。個人の変更はデータベースに保存されますが、車の変更は保存されません。改造車を装着してオブジェクトの状態も設定することで、dbにも変更が保存されます。

私の質問は、 person オブジェクトのみを context にアタッチすることが可能で、 context がすべての car エンティティを単独でアタッチするかどうかです。すべての子オブジェクトとサブ子オブジェクトを単独で保存します。

解決策の 1 つは、オブジェクトを変更/追加/削除してリストに保存し、人物を新しいコンテキストに関連付けた後にそれらのすべてを関連付けることです。

コードを提供できなくて申し訳ありません。不在です。

また、これは問題全体の単純化されたバージョンですが、正確です

編集 - いくつかのコードが追加されました- 最後にオフィスで

    <Grid Name="testGrid" DataContext="{Binding}" Initialized="testGrid_Initialized">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        <Label Name="ID" Grid.Row="0" Content="{Binding Path=ID}"/>
        <TextBox Name="Name" Grid.Row="1" Text="{Binding Path=Name}"/>
        <ItemsControl Grid.Row="2" ItemsSource="{Binding Path=Cars}" >
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Vertical" VerticalAlignment="Stretch">
                    </StackPanel>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Name="btnCar" Content="{Binding Path=Name}" Click="btnCar_Click" Tag="{Binding .}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
        <Button Content="Save" Click="Button_Click"/>
    </Grid>

そしてイベントハンドラー....

private void btnCar_Click(object sender, RoutedEventArgs e)
    {
        Button b = sender as Button;
        Car c = b.Tag as Car;
        Car.Name += "-"; 
    }
    #endregion

    private void testGrid_Initialized(object sender, EventArgs e)
    {
        using(var c = new DbContext())
        {
            globalPerson = c.Person.First();

            Grid g = sender as Grid;
            g.DataContext = globalPerson;

            globalPerson.Name += "_";
        }
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        using(var c = new DbContext())
        {
            c.Attach(globalPerson);
            c.ObjectStateManager.ChangeObjectState(globalPerson, EntityState.Modified);

            c.SaveChanges();

        }
    }

この結果、saveChenges を呼び出した後、Person の変更は DB に保存されますが、車の名前に加えられたものは保存されません。変更した Car エンティティもコンテキストにアタッチすると、それらも保存されます。すべてが機能します。

問題は、変更、追加されたエンティティのリストを維持しなければならないことです....そしてそれらのすべての人を手動で添付する必要があります。ぐちゃぐちゃになります。

知りたいのですが、人物がアタッチされたときに、Car エンティティを自動的にコンテキストにアタッチすることは可能ですか。

エンティティの処理を行うプロパティが不足している可能性があります。

4

0 に答える 0