0

我有一个名为 Person 的实体和另一个名为 Car 的实体,其中每辆车只能由一个人拥有。该人是通过 Ef 从 DB 中检索到的。然后我将这个人设置为 rhe datacontext 到一个 WPF 网格,其中属性绑定到一些控件。太好了太好了。在网格内部,我有一个 itemscontrols,它通过直接绑定显示 CarCollestion 作为 Person 对象的 itemssource。演示文稿完美。选择汽车并对其进行编辑,汽车对象接受更改。关于救人我也想救车收藏。我将这个人附加到一个新的上下文中,将这个人的对象状态更改为已修改并点击 savechanges。人的变化存储在数据库中,而不是汽车的变化。通过附加修改后的汽车并设置对象状态,更改也会保存到数据库中。

我的问题是,是否可以仅将 person 对象附加到 context ,并且 context 会自行附加所有汽车实体。自行保存所有子对象和子对象。

一种解决方案是将对象修改/添加/删除,存储在列表中,并在将人员附加到新上下文后附加每个对象。

抱歉没有提供任何代码,我不在办公室。

此外,这是整个问题的简化版本,但准确

编辑 - 添加了一些代码- 终于在办公室

    <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