使用实体框架

时间:2016-03-17 20:50:20

标签: c# wpf entity-framework validation mvvm

我正在使用Visual Studio 2015编写WPF MVVM Light应用程序。数据已使用Entity Framework 6引入,使用数据库优先生成模型。在我的MainViewModel.cs文件中,我想在执行SaveChanges()之前验证数据。

我见过的例子谈到了为模型添加注释(例如,this);但是,我使用自动生成的Entity Framework模型。我的ViewModel引用了ObservableCollection<Employee>个对象 - 没有任何内容直接引用字段,因此我可以在它们上面添加注释。

这是SearchResults属性,它保存从EF返回的结果:

private ObservableCollection<Employee> _searchResults;
public ObservableCollection<Employee> SearchResults
{
    get { return _searchResults; }
    set
    {
        if (_searchResults == value) return;

        _searchResults = value;
        RaisePropertyChanged("SearchResults");
    }
}

搜索后填充SearchResults并绑定到DataGrid:

var query = Context.Employees.AsQueryable();

// Build query here...

SearchResults = new ObservableCollection<Employee>(query.ToList());

用户单击DataGrid上的一行,我们会显示要更新的详细信息。然后他们可以点击“保存”按钮。但我们希望在执行Employee之前验证每个Context.SaveChanges()中的字段。

这是由实体框架自动生成的部分类Employee的相关区域:

public int employeeID { get; set; }
public int securityID { get; set; }
public string firstName { get; set; }
public string middleName { get; set; }
public string lastName { get; set; }
public string suffix { get; set; }
public string job { get; set; }
public string organizationalUnit { get; set; }
public string costCenter { get; set; }
public string notes { get; set; }
public System.DateTime createdDate { get; set; }

例如,securityID不能为空,且必须为int,而firstNamelastName是必需的,等等。如何完成此验证并向用户显示错误?

1 个答案:

答案 0 :(得分:3)

我假设您向用户显示您正在使用的详细信息TextBox es(您可以对其他控件应用相同的解决方案)。

在用户更改Employee的属性后,不要验证数据,只需事先验证,如果属性无效,则不要更改属性。

您可以使用ValidationRule课程轻松完成此操作。例如:

<ListBox ItemsSource="{Binding Employees}" Name="ListBoxEmployees">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}"></TextBlock>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
<TextBox>
    <TextBox.Text>
        <Binding ElementName="ListBoxEmployees" Path="SelectedItem.Name" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <stackOverflow:NotEmptyStringValidationRule/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

和验证规则:

public class NotEmptyStringValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        string s = value as string;
        if (String.IsNullOrEmpty(s))
        {
            return new ValidationResult(false, "Field cannot be empty.");
        }

        return ValidationResult.ValidResult;
    }
}

当任何验证规则失败时,您也可以禁用“保存”按钮。