【问题标题】:Update Entity Framework navigation property ICollection items更新实体框架导航属性 ICollection 项
【发布时间】:2016-03-29 02:06:48
【问题描述】:

我在 Visual Studio 2015 中使用 Entity Framework 6 来构建一个 MVVM Light WPF 应用程序。我需要将导航属性 ICollection 绑定到一些 CheckBox 控件。一个 Employee 最多可以有 0 到 3 个 EmployeeStatus 实体,其中 employeeID 作为 EmployeeStatus 实体的键; EmployeeStatus 又在employeeStatusID 的EmployeeStatusDescription 表上有一个外键。 EmployeeStatusDescription 提供状态代码的描述(例如“归档”、“非活动”、“请假”)。每个 EmployeeStatus 对应一个 EmployeeStatusDescription。

EmployeeStatus 在 Employee 类中是这样定义的:

public virtual ICollection<EmployeeStatu> EmployeeStatus { get; set; }

EmployeeStatusDescription 在 EmployeeStatus 类中定义为:

public virtual EmployeeStatusDescription EmployeeStatusDescription { get; set; }

我想展示 3 个 CheckBox 控件并将每个控件绑定到来自 EmployeeStatus ICollection 值的值。例如,如果员工没有状态“Inactive”并且用户检查了它,我需要将其添加到 EmployeeStatus 集合中;如果用户取消选中该项目,我希望将其从 EmployeeStatus 集合中删除。

我创建了以下 StackPanel 来保存复选框;它们绑定到我的视图模型上的属性:

<StackPanel Grid.Row="12"
            Grid.Column="1"
            Orientation="Vertical">
    <StackPanel Orientation="Horizontal">
        <TextBlock HorizontalAlignment="Left"
                   VerticalAlignment="Top"
                   Text="Inactive" />
        <CheckBox IsChecked="{Binding IsSelectedEmployeeInActive}" />
    </StackPanel>
    <StackPanel Orientation="Horizontal">
        <TextBlock HorizontalAlignment="Left"
                   VerticalAlignment="Top"
                   Text="Leave of Absence" />
        <CheckBox IsChecked="{Binding IsSelectedEmployeeLoa}" />
    </StackPanel>
    <StackPanel Orientation="Horizontal">
        <TextBlock HorizontalAlignment="Left"
                   VerticalAlignment="Top"
                   Text="Archived" />
        <CheckBox IsChecked="{Binding IsSelectedEmployeeArchived}" />
    </StackPanel>                                    
</StackPanel>

这是一个绑定到 CheckBox 控件的 IsChecked 依赖属性之一的示例属性:

private bool _isSelectedEmployeeInActive;

public bool IsSelectedEmployeeInActive
{
    get { return _isSelectedEmployeeInActive; }
    set
    {
        if (_isSelectedEmployeeInActive == value) return;

        _isSelectedEmployeeInActive = value;
        RaisePropertyChanged(() => IsSelectedEmployeeInActive);
    }
}   

我正在搜索以获取实体集合:

var query = (from e in Context.Employees
             .Include("EmployeeStatus.EmployeeStatusDescription")
             .Where(comparison)
             select e);

SearchResults = new ObservableCollection<Employee>(query);

【问题讨论】:

    标签: c# wpf entity-framework checkbox mvvm


    【解决方案1】:

    在您的属性中,我还将从集合中添加/删除。如果您还没有,请将选定的员工存储在某个地方以便您可以访问它。

               if (_isSelectedEmployeeInActive == value) return;
    
                _isSelectedEmployeeInActive = value;
    
                //do updates to collection here
                if (value)
                {
                    SelectedEmployee.EmployeeStatus.Add(new EmployeeStatus("Inactive"));
                }
                else
                {
                    SelectedEmployee.EmployeeStatus.Remove("Inactive"));
                }
    
                RaisePropertyChanged(() => IsSelectedEmployeeInActive);
    

    我不确定您的员工状态如何,但您明白了。 只需确保在完成选中您在上下文中调用 SaveChanges 的框后,您的更改就会保存到数据库中。

    【讨论】:

    • 谢谢,@bme2010。我如何确保不向不存在的 EmployeeStatuses 的 ICollection 添加值?如果值已经存在,EF 会在 .Add() 上炸毁吗?
    • EF 只有在违反外键约束时才会崩溃。如果您可以有多个具有相同名称的值,它将允许您添加它们。要检查重复项,您可以在您的 ICollection 上使用 LINQ .Where(x =&gt; x.Name == "Inactive").Count()
    • 再次感谢@bme2010。我会在Add() 之前进行检查。
    • 嗨@bme2010。当我尝试运行SaveChanges() 时,Remove 上出现此错误:The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
    • 我需要在Remove 之前添加它以使其工作:Context.Entry(itemToRemove).State = EntityState.Deleted; 其中itemToRemove 是我希望删除的Single() 记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多