在没有数据库连接的情况下使用Entity Framework

时间:2015-04-02 18:56:35

标签: c# entity-framework

我有一个应用程序,我绑定到数据库以加载和存储数据。

但是我不想要求用户在网络上并且可以访问数据库。没有连接就无法加载或保存。

我想在没有数据库连接的情况下实例化它(只是在内存中使用它),但是所有构造函数都使用数据库。我宁愿不修改实体框架生成的.cs文件,以防我需要再次从DB更新它我不想消除我的更改。

如何在没有连接的情况下使用EF模型?

public partial class SimRunnerEntities : ObjectContext
{
    #region Constructors

    /// <summary>
    /// Initializes a new SimRunnerEntities object using the connection string found in the 'SimRunnerEntities' section of the application configuration file.
    /// </summary>
    public SimRunnerEntities() : base("name=SimRunnerEntities", "SimRunnerEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    /// <summary>
    /// Initialize a new SimRunnerEntities object.
    /// </summary>
    public SimRunnerEntities(string connectionString) : base(connectionString, "SimRunnerEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    /// <summary>
    /// Initialize a new SimRunnerEntities object.
    /// </summary>
    public SimRunnerEntities(EntityConnection connection) : base(connection, "SimRunnerEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

所有SimRunnerEntities构造函数都使用某种有效的连接

2 个答案:

答案 0 :(得分:2)

实例化DbContext不会打开与数据库的连接。在进行第一次查询后,将打开数据库连接,您可以在其中选择一些左右。因此,如果您不修改或读取任何数据,则无需访问数据库即可完全安全地工作。

问题是,除了使用它的实体类进行某些自定义目的之外,您无法在不触发数据库的情况下对EF DbContext执行任何操作。

另一个问题是:您的应用程序是否可以在不使用数据库的情况下正常工作?你想要实现什么目标?

答案 1 :(得分:1)

是的,你可以这样做。

在示例中,我有一个与该架构布局一起使用的解决方案:
项目A - 服务器端(WCF)
项目B - 包含EF模型+数据库连接的类库
项目C - 客户端(WPF)

对B的引用,
A是WCF并从B硬拷贝配置,因此它可以使用DBContext访问数据库。

C对B的引用,
C是WPF项目,使用WCF从A填充的实体已经拥有了已经由EF自动生成的INPC等好东西。


我必须在客户端添加的唯一东西是一个自定义类容器,它包含实体类型的属性列表(即List Users {get; set;}等等。)


根据评论请求进一步解释:

问:你能解释一下吗?如果您的项目B具有数据库连接,那么该解决方案如何在没有数据库连接的情况下工作。

答:当然,项目B配置文件(app.config)根本就没有被使用。
我只是在那里用于存档或复制粘贴..
我确实将其复制并粘贴到Project A app.config。

问:在UI中,我想实例化一个数据对象,但在没有有效连接字符串的情况下失败,因为它包含一个EF项。

答:关于实例化一个对象..就像你实例化任何其他对象一样:
var entityX = new MyEntity{fill props code here};
我不需要使用Dbcontext来做到这一点。

我认为您的下一个问题可能是如何将数据从WCF计划到客户端 - 使实体“可跟踪”?为此,我创建了一个完整的DTO图层..但是这超出了原来的问题范围:) 关于简单的问题,您可以使用实体而不使用dbcontext来管理它们,答案是:是。