如何自动将entityobjects附加到上下文

时间:2013-07-10 19:17:57

标签: wpf c#-4.0 entity-framework-4 object-state

我有一个名为Person的实体和另一个名为Car的实体,其中evey car只能由一个人拥有。 通过Ef从DB中检索该人。 然后我将人员设置为rhe datacontext到WPF网格,其中属性绑定到某些控件。很好,所以好。 在网格内部,我有一个itemscontrols,通过直接绑定显示CarCollestion作为Person对象的itemssource。 Presentatio完美无缺。 Iselecta汽车并编辑它,汽车对象接受更改。在保存这个人的同时,我也想保存汽车收藏品。 我将此人附加到新上下文,将人员的对象状态更改为已修改并按下savechanges。 人的变化存储在Db中,但不存储在汽车的变化中。 通过附加修改后的汽车并设置对象状态,更改也会保存到数据库中。

我的问题是,如果可能只有person对象附加到上下文,并且上下文将自己附加所有汽车实体。保存所有子项和子项。

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

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

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

编辑 - 添加了一些代码 - 最后在办公室

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

和eventhandlers ....

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实体自动附加到上下文。

也许我错过了一个负责实体的财产。

0 个答案:

没有答案