Entity framework 具有存储库模式且无数据库的EntityFramework

Entity framework 具有存储库模式且无数据库的EntityFramework,entity-framework,asp.net-web-api,repository-pattern,Entity Framework,Asp.net Web Api,Repository Pattern,我有一个web api项目,我正在N层系统上构建。在不对整个系统进行太多更改的情况下,我将不接触可以访问数据库的数据服务器。相反,我使用.NET远程处理创建一个tcp通道,允许我向数据服务器发送请求,然后数据服务器将查询数据库并发送回响应对象 在我的应用程序中,我希望使用entity framework创建我的DataContext(工作单元),然后创建一个与这些上下文交互的存储库模式,我创建的web api项目将调用该模式 然而,我在实体框架方面遇到了问题,因为它需要我与数据库建立连接。我是否

我有一个web api项目,我正在N层系统上构建。在不对整个系统进行太多更改的情况下,我将不接触可以访问数据库的数据服务器。相反,我使用.NET远程处理创建一个tcp通道,允许我向数据服务器发送请求,然后数据服务器将查询数据库并发送回响应对象

在我的应用程序中,我希望使用entity framework创建我的DataContext(工作单元),然后创建一个与这些上下文交互的存储库模式,我创建的web api项目将调用该模式

然而,我在实体框架方面遇到了问题,因为它需要我与数据库建立连接。我是否可以创建一个完整的实体框架项目,而不需要任何到数据库的sqlconnections?我只需要dbcontexts,我将映射我的响应对象,我认为EF将做我需要的事情(即帮助设计和团队协作,并提供一个漂亮的图形设计器);但它抛出一个错误,坚持我需要一个连接字符串


我一直在到处寻找教程,其中不需要数据库,也不需要任何sql连接字符串(这意味着也没有localdb)。

好的,正如我承诺的,我有3种解决方案。我个人和#3一起去的

注意:只要存在存储库模式,并且使用了“datacontext”,就会将其解释为您的工作单元

解决方案1:创建单例来表示您的数据上下文。

我是在访问BreezeJS.com网站并查看他们的样品后发现这个想法的。他们有一个名为NoDb的示例,它允许他们创建一个单例,可以创建一个项和一个项列表,以及一个填充datacontext的方法。您创建的单例将锁定内存中的空间,以防止任何类型的线程冲突。下面是一段tid代码:

//generates singleton
public class TodoContext
{
    static TodoContext{ }
    private TodoContext() { }

    public static TodoContext Instance
    {
        get
        {
            if (!__instance._initialized)
            {
                __instance.PopulateWithSampleData();
                __instance._initialized = true;
            }
            return __instance;
        }
    }

    public void PopulateWithSampleData()
    {
        var newList = new TodoItem { Title = "Before work"};
        AddTodoList(newList);
        var listId = newList.TodoListId;
        var newItem = new TodoItem { 
               TodoListId = listId, Title = "Make coffee", IsDone = false };
        AddTodoItem(newItem);
        newItem = new TodoItem { 
               TodoListId = listId, Title = "Turn heater off", IsDone = false };
        AddTodoItem(newItem);
    }

   //SaveChanges(), SaveTodoList(), AddTodoItem, etc.
   { ... }

   private static readonly Object __lock = new Object();
   private static readonly TodoContext __instance = new TodoContext();
   private bool _initialized;
   private readonly List<TodoItem> _todoLists = new List<TodoItem>();
   private readonly List<KeyMapping> _keyMappings = new List<KeyMapping>();

 }
因为在我的例子中,entityset=Persons和entityname=Person。所以会有差异。但这应该涵盖所有基础

最后一步:

因此,无论您选择解决方案1、2还是3。您有一个自动填充应用程序的方法。在这些情况下,存根被嵌入到代码中。在我的例子中,我所做的是让我的web服务器(包含我的前端应用程序),联系我的数据服务器,让数据服务器查询数据库。数据服务器将接收数据集,对其进行序列化,并将其传递回web服务器。web服务器将获取该数据集,对其进行反序列化,并自动映射到对象集合(列表、可枚举或对象集合等)

我会更全面地发布解决方案,但这三个解决方案之间的细节太多了。希望这些解决方案能为任何人指明正确的方向

依赖注入 如果有人想要一些关于如何允许DI访问api控制器的信息,Peter Provost提供了一个非常有用的博客来解释如何做到这一点。他干得很好

关于包装edmx的存储库的几个更有用的链接:

Sooooo。。。。你想嘲笑我吗?Dan,是的,但是所有的模拟教程都需要某种连接字符串,这是没有办法的。我不是有意删除那个评论。但是你的补充信息很有帮助。至于我想使用EF的原因,是因为它可以帮助我的队友提供视觉效果,并帮助简化创建数据上下文及其与其他数据上下文的关系(就像外键一样,并显示n对n的关系..因此我仍然可以通过在前端复制架构来保持数据库的完整性)。如果我真的做不到这一点,我将不得不只使用代码路由RRY,但为什么需要不连接到DB的OR/M?
public class State
{
    [Key()]
    public string Abbr{ get; set; }
    public string Name{ get; set; }
}

public class StateContext : DbContext
{
    public virtual IDbSet<State> States { get; set; }
}

public class SampleDatastoreInitializer : DropCreateDatabaseAlways<StateContext>
{
    protected override void Seed (StateContext context)
    {
        var states = new List<State>
        {
            new State { Abbr = "NY", Name = "New York" },
            new State { Abbr = "CA", Name = "California" },
            new State { Abbr = "AL", Name = "Alabama" },
            new State { Abbr = "Tx", Name = "Texas" },
        };
        states.ForEach(s => context.States.Add(s));
        context.SaveChanges();
    }
}
public string DbSetInConstructor(EntitySet entitySet)
{
    return string.Format(
        CultureInfo.InvariantCulture,
        “this.{1} = new BaseRepository();”,
        _typeMapper.GetTypeName(entitySet.ElementType), entitySet);
}