【问题标题】:C# repository pattern dbcontext errorC# 存储库模式 dbcontext 错误
【发布时间】:2015-08-01 13:03:56
【问题描述】:

我正在尝试使用存储库模式制作一些东西,我制作了 3 层 winUI、dll 和存储库,它们都引用了实体框架,但我的基础存储库在这里不起作用是下面的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using KuzeyYeli.ORM.Models;

namespace KuzeyYeli.Repository
{
    public class RepositoryBase<T> where T:class
    {

        private static NORTHWNDContext context;
        //singelton pattern
        public NORTHWNDContext Context
        {

            get {
                   if (context==null)
                          context=new NORTHWNDContext();
                   return context;
                }
            set { context = value;}
        }

        public IList<T> Listele()
        {
            return Context.Set<T>.ToList();
        }


    }
}

Set 给了我错误,例如“不包含'set' 的定义并且没有扩展名”,顺便说一下,当我写“上下文”时。我看不到 EF 制作的课程,我真的需要知道,请帮助

【问题讨论】:

  • 不肯定它会修复你的错误,但你可能想把static从你的成员变量中去掉。将其标记为静态使其对于从您的基类继承的所有实例都是全局的,并且它将在所有请求中持续存在。不是你想要的。
  • 我知道,但这就是单例模式的要点,它应该在我编写“上下文”之后立即向我显示 NORTHWNDContext(这是我的数据库类)中的类。在 Listele 方法中
  • 可能是单例模式的重点,但是单例模式在存储库模式中没有业务
  • 您可能想查看此问题的答案:stackoverflow.com/questions/31646525/…

标签: c# entity-framework repository-pattern


【解决方案1】:

拥有存储库模式的全部意义在于解耦应用程序中的各个层,此外还可以更轻松地对应用程序进行单元测试。

实现存储库模式的正确方法是拥有一个定义四种基本方法的接口...

public interface IEntity
{
    string Id { get; set; } 
}

public interface IRepository<T> where T : IEntity
{
    void Add(T entity);
    void Remove(T entity);
    void Create(T entity);
    T Find(string id);
}

现在您可以为您的任何实体实现此接口,假设您正在创建一个博客,一个博客将包含帖子,对吗?

所以,创建一个 PostsRepository...

public class Post : IEntity
{
    public Post()
    {
        this.Id = Guid.NewGuid().ToString();
    }

    public string Id { get; set;}
}

public class PostsRepository : IRepository<Post>
{
    public void Add(Post entity);
    /// etc
}

这就是它应该实现的方式,尽管上面的示例没有考虑到数据访问逻辑是使用实体框架组成的。


现在我们知道了存储库模式是什么,让我们继续集成实体框架...

PostsRepository 类中,您将拥有一个可以引用您的实体框架DbContext 的属性。请记住,PostsRepository 是一个具体实现,它将用于任何其他依赖于 IRepository 的类。


那何必呢,看起来麻烦多多,收效甚微,但你错了……

假设您正在尝试验证提交到网站的帖子中的内容...如何隔离验证逻辑同时避免对数据库进行任何调用?

您可以创建手动模拟对象来实现不引用 EntityFramework 作为数据源的 IRepository(这是一个冗长的方法)......或者您可以简单地使用现有的框架,例如 Moq ,您可以使用它来创建 IRepository 的假实现。


所以,简而言之,你需要开始学习的是:

  • 依赖倒置
  • 存储库模式
  • 装饰图案
  • N 层架构
  • 洋葱架构

一旦代码库增长,所有这些都会对您的应用程序的可维护性产生重大影响。你不需要成为专家,这将通过犯错误和在这里和那里咬几颗子弹来实现……但对这些有一个大致的了解即使在短期内也会产生巨大的影响。

【讨论】:

  • 非常感谢先生,这对我自己是 Ef 和存储库模式的新学习者来说真的很有帮助,我发现我的错误是我在将我的 ORM 层引用到存储库层时对 Visual Studio 做错了它生成了一个 NOORTHWNDContext.cs,但是当我检查它是“空的”时,当我将 ORM 层的上下文复制到存储库层时,它修复了我只是说如果有人还在想什么是错误的,只是说它是固定的..
  • 欢迎您,记住最好的学习方式是边做边学!所有这些主题听起来让人不知所措,因为它们是新术语……一旦您意识到每种模式背后的概念是多么简单,以及它们的用途是什么,这一切都变得轻而易举,
  • 还可以看看使用工作单元模式来进一步抽象你的上下文。在这种情况下是实体框架。
猜你喜欢
  • 2015-01-23
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2018-09-24
相关资源
最近更新 更多