Mvvm Light和实体框架核心最佳实践

时间:2016-06-27 10:01:03

标签: c# entity-framework uwp mvvm-light

我正在使用Mvvm Light和Entity Framework Core创建一个新的UWP应用程序。我是这两项技术的新手。

我创建了我的模型:文章类是一个简单的ObservableObject,有3个属性: Id RéférenceDésignation

我的DbContext如下:

public class UniversalTest1Context : DbContext
{
    public DbSet<Article> Articles { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Filename=UniversalTest1.db");
    }

}

我正在寻找管理DbContext和我不同观点的最佳方式。

为整个应用程序创建一个DbContext是否更好? 我真的不喜欢这个想法

我是否必须在每个ViewModel中创建DbContext? 我更喜欢这个 当用户双击文章列表视图中的项目时,我导航到文章详细信息视图并将文章传递给与文章详细信息视图关联的视图模型。但是这篇已经存在的文章与文章详细视图模型的DbContext无关。

是否可以仅在需要时实例化DbContext? 我的首选选项 为此,我将文章从列表视图模型传递给详细视图模型。然后,当用户单击“保存”时,我执行以下操作:

using (var db = new UniversalTest1Context())
{
    db.Articles.Add(article);
    await db.SaveChangesAsync();
}

当然,这适用于新文章(插入),但不适用于现有文章(更新)。

我很难在这里下定决心。

非常感谢, 于连

1 个答案:

答案 0 :(得分:0)

在我看来,你应该通过接口隐藏所有存储操作(比如IArticleRepo或像这样的smth),你应该使用IoC来访问它(如果某个类想要使用Store,它必须在ctor参数中声明IArticleRepo) 。此外,在此界面IArticleRepo中,您可以使用文章来进行必要的操作,例如IArticleRepo.AddArticle(文章a)。如果这样做,您可以稍后选择是否要为每个操作创建dbcontext,或者您可能希望使用IoC容器将IArticleRepo实现为单线程。但是这样的决定不应该影响其他代码。 在我的代码中非常简单的样本(我只显示这个文件,整个项目很难看,我会更改它)https://github.com/tym32167/arma3beclient/blob/master/src/Arma3BE.Client.Libs/Repositories/PlayerRepository.cs#L23