C# 将实体框架数据库第一个db上下文与mvvm视图模型类一起使用
我是MVVM和WPF的新手,我不完全确定我现在要问的是否正确 我正在制作一个MVVM WPF应用程序。我有一个SQL Server数据库,我首先使用实体框架数据库为我生成模型类。我已经创建了视图模型类,从我今天阅读的几十篇教程中了解到,我需要一个由视图模型类组成的ObservableCollection。对吗 问题是Entity Framework已经为我生成了一个数据库上下文,其中包含集合,但它们使用的是模型类,如果上述内容正确,那么我需要使Entity Framework数据库上下文使用我的视图模型类。问题是怎么做 我是否需要创建一个新的数据库上下文类来满足我的需要并使用它,还是缺少一种更简单的方法? 以下是Entity Framework为我生成的模型类:C# 将实体框架数据库第一个db上下文与mvvm视图模型类一起使用,c#,wpf,mvvm,model,viewmodel,C#,Wpf,Mvvm,Model,Viewmodel,我是MVVM和WPF的新手,我不完全确定我现在要问的是否正确 我正在制作一个MVVM WPF应用程序。我有一个SQL Server数据库,我首先使用实体框架数据库为我生成模型类。我已经创建了视图模型类,从我今天阅读的几十篇教程中了解到,我需要一个由视图模型类组成的ObservableCollection。对吗 问题是Entity Framework已经为我生成了一个数据库上下文,其中包含集合,但它们使用的是模型类,如果上述内容正确,那么我需要使Entity Framework数据库上下文使用我的
public partial class Parent
{
public Parent()
{
this.Children = new HashSet<Child>();
}
public int ID { get; set; }
public string Name { get; set; }
public string PIN { get; set; }
public string Account { get; set; }
public string Identity_Card { get; set; }
public string Address { get; set; }
public virtual ICollection<Child> Children { get; set; }
}
公共部分类父类
{
公共家长()
{
this.Children=newhashset();
}
公共int ID{get;set;}
公共字符串名称{get;set;}
公共字符串PIN{get;set;}
公共字符串帐户{get;set;}
公共字符串标识卡{get;set;}
公共字符串地址{get;set;}
公共虚拟ICollection子项{get;set;}
}
提前谢谢。告诉我是否遗漏了某些内容或添加了部分代码,我会这样做。只需将当前数据上下文中的模型引用替换为您想要使用的模型引用即可 问题是实体框架已经生成了一个数据库 上下文,其中包含集合,但它们正在使用模型 如果以上是正确的,那么我需要 实体框架数据库上下文使用我的视图模型类。这个 问题是怎么做 不确定我是否理解你在这里说的话,但生成的类就是生成的类。你不应该把它们塑造成别的东西 视图模型类可以读取生成的类。现在我可以想象这感觉像复制,但还有更多的需要考虑。首先,数据库类可以包含比您希望在视图中显示的更多的数据。因此,隐藏数据以便只向视图提供它们所需的数据是一个完美的策略。我认为从安全角度来说,在您看来,您不希望提供直接连接到数据库的实体也是安全的。但这可能是另一种讨论 因此,创建视图模型并用实体提供的数据填充它们
无论如何,不要修改生成的类,使其在再次生成时需要重新生成:)。类似的内容很可能就足以满足@bas所提到的内容, 我也同意这是一条理想的道路。。您的viewmodels不可用 你的模特
public class MainViewModel : INotifyPropertyChanged
{
public MainViewModel(IRepository<Parent> parentRepo, IViewModelFactory factory)
{
// you might want to set this up as a fancy async method
// because.. it looks better and it's easier to read
Task.Factory
.StartNew(() => parentRepo.GetAll())
.ContinueWith(t =>
{
// Do error checking and all that boring stuff
ParentViewModels =
new ObservableCollection<ParentViewModel>(
t.Result.Select(p => factory.Create<ParentViewModel>(p)));
}, TaskScheduler.FromCurrentSynchronizationContext());
}
private ObservableCollection<ParentViewModel> _parentViewModels;
public ObservableCollection<ParentViewModel> ParentViewModels
{
get
{
return _parentViewModels;
}
set
{
_parentViewModels = value;
RaisePropertyChanged("ParentViewModels");
}
}
// INotifyPropertyChanged implementation goes here
}
// Super secret sauce viewmodelfactory and repository implementations go here
public类主视图模型:INotifyPropertyChanged
{
公共主视图模型(IRepository parentRepo、IViewModelFactory)
{
//您可能希望将其设置为一个奇特的异步方法
//因为…它看起来更好而且更容易阅读
任务,工厂
.StartNew(()=>parentRepo.GetAll())
.ContinueWith(t=>
{
//做错误检查和所有那些无聊的事情
ParentViewModels=
新可观测集合(
t、 选择(p=>factory.Create(p));
},TaskScheduler.FromCurrentSynchronizationContext());
}
私有ObservableCollection\u parentViewModels;
公共可观测集合ParentViewModels
{
得到
{
return\u parentViewModels;
}
设置
{
_parentViewModels=值;
RaisePropertyChanged(“ParentViewModels”);
}
}
//INotifyPropertyChanged实现位于此处
}
//超级机密的viewmodelfactory和存储库实现在这里
looooot要阅读的文本。段落的可读性帮助:)我对它进行了一些编辑。希望它现在更可读:)嗯,不确定我是否遵循,但每个数据库方案只需要一个数据库上下文。您已经准备好了,但是您想与视图模型共享该数据吗?是这样吗?如果是这样的话,是什么阻止了你呢。听上去你是对的,问题是数据库上下文中的集合来自类型DbSet和我看到的教程,我认为它们应该是可观察的集合。对吗?我觉得这里有点不对劲。。。正如我之前所说,我是MVVM的新手,所以这可能只是我一个人,可能没有什么问题。我只是想确定我走的是正确的道路;-)不要忘记,ViewModel上的集合实际上不必是可见的,除非您计划在视图打开时对其进行更改。这不是执行MVVM的要求:)是的。我考虑过这种方法,但问题是,当我从数据库中重新生成模型类时,例如,当我添加一个新的列或表时,我必须一次又一次地这样做。这不是什么大问题。我只是觉得可能有更好的办法。:)然后使用生成的模型访问数据库,然后创建映射函数,将EF模型转换为视图模型,反之亦然。你可以去图书馆帮忙。谢谢。我将尝试:)还有一件事:有没有更好的方法可以先使用实体框架数据库的MVVM模式?我错过什么了吗?我只是觉得有更好的方法做某事。。。我可能错了,但我只是想确定;)不,你没有遗漏任何东西。您可以使用MVVM。下次如果你想考虑的话