Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将MVVM与EF一起使用(在SQLite中使用相当复杂的数据库)?_C#_Wpf_Entity Framework_Xaml_Mvvm - Fatal编程技术网

C# 如何将MVVM与EF一起使用(在SQLite中使用相当复杂的数据库)?

C# 如何将MVVM与EF一起使用(在SQLite中使用相当复杂的数据库)?,c#,wpf,entity-framework,xaml,mvvm,C#,Wpf,Entity Framework,Xaml,Mvvm,我试图拥有一个MVVM架构,而模型也是EF模型 代码: 型号: 公共类NotaireDBContext:DbContext { 公共DbSet Paquets{get;set;} 公共数据库集人员{get;set;} 公共DbSet合同{get;set;} 配置时受保护的覆盖无效(DbContextOptionsBuilder选项)=>options.UseSqlite(@“Data Source=db/Notaire.db”); } 公共类Paquet { 公共int PaquetId{get

我试图拥有一个MVVM架构,而模型也是EF模型

代码:

型号:

公共类NotaireDBContext:DbContext { 公共DbSet Paquets{get;set;} 公共数据库集人员{get;set;} 公共DbSet合同{get;set;} 配置时受保护的覆盖无效(DbContextOptionsBuilder选项)=>options.UseSqlite(@“Data Source=db/Notaire.db”); } 公共类Paquet { 公共int PaquetId{get;set;} 公共字符串Numero{get;set;} 公共日期时间日期{get;set;} 公共字符串卷{get;set;} 公共字符串页{get;set;} 公共字符串Etat{get;set;} 公共列表控件{get;}=new List(); } 公职人员 { 公共int人员ID{get;set;} 公共字符串Nom{get;set;} 公共字符串Prenom{get;set;} 公共字符串Nom_pere{get;set;} 公共片段identite片段identite{get;set;} 公共字符串Num_片段{get;set;} 公共字符串生成{get;set;} 公共字符串Date_naissance{get;set;} 公共字符串Commune{get;set;} 公共字符串Numero_acte{get;set;} 公共字符串Laiv_carte{get;set;}/?????????????? 公共字符串地址{get;set;} 公共字符串国有化{get;set;} 公共字符串函数{get;set;} } 公共类合同 { 公共int contractid{get;set;} 公共字符串Numero{get;set;} 公共日期时间日期{get;set;} 公共列表Partie_1{get;set;} 公共列表Partie_2{get;set;} 公共int PaquetId{get;set;} 公共Paquet Paquet{get;set;} } 观点:

PaquetsView.xaml(这是所有paquets的视图)


我在PaquetsView.xaml.cs中绑定它的ItemsSource,如下所示:

public部分类PaquetsView:UserControl
{
private NotaireDBContext db=new NotaireDBContext();
公共PaquetsView()
{
初始化组件();
PaquetControl.ItemsSource=(从db.Paquets中的p选择p.ToList();
}
}
PaquetView.xaml->ItemsControl的DataTemplate位于另一个xaml文件(PaquetControl.xaml)中,这是一个用户控件,由文本块和带有菜单(和菜单项)的按钮组成,显示Paquet中保存的数据,应该能够编辑/删除所述Paquet。 其中一部分:

...
<Button x:Name="MoreButton" Style="{DynamicResource MoreButtonTemplate}" 
        Grid.Column="2" Click="MoreButtonClicked" Margin="0,-4,-4,0">
    <Button.ContextMenu>
        <ContextMenu Background="White" FlowDirection="RightToLeft">
            <MenuItem Header="Edit" Click="EditMenuItemClick"/>
            <MenuItem Header="Archive" Click="ArchiveMenuItemClick"/>
            <MenuItem Header="حذف" Click="DeleteMenuItemClick"/>
        </ContextMenu>
    </Button.ContextMenu>
</Button>
...
<TextBlock Grid.Column="0" Text="{Binding Path=Numero}" FontSize="22" Foreground="Black"/>
...
<TextBlock Grid.Row="1" Text="{Binding Path=Date, StringFormat=yyyy/MM/dd}" 
           Foreground="Black" FontSize="16"/>
...
<!--other TextBlock binded-->
。。。
...
...
...
现在我想知道如何通过视图的更新使其成为CRUD


总之,我有一个用于数据持久化的SQLite DB(代码优先),我可以使用DBContext获取数据,但现在我发现每次使用MVVM都比创建DBContext要好。

这是一个非常大的主题,我怀疑它是否适合这里采用的格式。
因此,我将仅简要概述要点

通常使用MVVM模式实现WPF。
它是一个严格的三层体系结构:视图(WPF)->视图模型->模型。 模型负责处理“真实”数据——这就是所谓的业务逻辑。 视图负责创建GUI。
WPF的特点是UI元素本身通过绑定请求所需的数据。
将创建(大部分)到DataContext的绑定。
因此,有必要在那里放置一些特殊的自定义类型,它负责视图和模型之间的链接。
这种类型称为ViewModel。
在典型的实现中,模型基本上通过方法接收/返回数据。
和绑定需要属性。
因此,ViewModel的主要功能之一是在其属性中提供视图所需的所有数据

当应用程序使用数据库时,Sharpe习惯于在存储库(数据)模式中实现这一点。
从MVVM的角度来看,这样的存储库是模型的一部分。 但是,为了更简单的理解,为了便于软件维护,存储库通常在单独的层中实现。
因此,我们得到了一个四层体系结构:视图->视图模型->模型->存储库

根据OOP的规则和原则,在分层体系结构中,每个层“只知道”(有信息)底层。
所有非公开信息都必须封装在该层中

EF实体反映数据库数据,它们是可变的,并且可以具有相应的属性。
更改源时,这些类型可能会更改。
假设您在某个时候希望使用一组XML文件而不是数据库。
它们需要不同类型的实体。
因此,这些实体是存储库的内部实现。 要与模型交换数据,存储库必须是模型类型或通用DTO类型

在下一级,ViewModel还必须从模型接收数据。
但是这里不能使用模型类型,因为它们可以隐式地与业务逻辑关联,并且有可能创建寄生连接,从而导致不可预测的错误。
在这个级别(ViewMode->Model),数据交换只使用DTO类型。
它们最好是不变的

与ViewModel交换视图的下一个级别。
首先,GUI通常需要可变属性。要自动更新属性视图,该类型必须实现INotifyPropertyChanged。
其次,要从GUI调用操作,ViewModel必须在其属性中提供命令-这是ICommand实现。
对于这里的答案,我使用了。
第三,在视图类型上,添加