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

3
我有一个应用程序,和一个数据库绑定以加载和存储数据。然而,我不想要求用户在网络上并且能够访问数据库。如果没有连接,它就不能加载或保存。
我想在不需要数据库连接的情况下实例化它(只在内存中使用),但所有构造函数都使用了数据库。我宁愿不修改实体框架生成的 .cs 文件,以防需要再次从数据库更新它时会抹掉我的更改。
如何在没有连接的情况下使用 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构造函数都使用某种有效的连接。

你想使用内存数据库吗?如果你的 EF 版本支持,就使用它。否则,将数据层抽象出来,这样你就可以用内存(或本地嵌入式数据库)替换 DB 连接。 - mason
不使用数据库是指在使用EF(Entity Framework)时,不连接到实际的数据库。 - Matthew
是的,我想使用内存。可以向表格中添加项目等操作而无需保存到数据库中。但我无法在没有有效连接字符串的情况下创建EF对象的实例。 - runfastman
请查看LocalDB https://msdn.microsoft.com/zh-cn/library/hh510202.aspx。无需网络连接。 - Bradley Uffner
谢谢你提供的LocalDB建议,我会研究一下。 - runfastman
2个回答

3

实例化DbContext并不会打开与数据库的连接。只有在进行第一次查询时,才会打开数据库连接,例如选择某些内容等。因此,如果您没有修改或读取任何数据,则可以完全安全地在没有访问数据库的情况下工作。

事实上,除非触发数据库操作,否则您无法真正使用EF DbContext,除非将其实体类用于某些自定义目的。

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


是的,它可以在没有数据库的情况下工作。我只是改用EF,这样当我想保存/加载一些预配置数据时就不必翻译所有内容了。如何在不尝试连接到数据库的情况下创建一个新的EF对象? - runfastman
你所说的“对EF对象进行新建”是什么意思?是实例化某个实体吗?如果是这样,只需使用“new”关键字,就像实例化任何其他类一样。 - Yura
请查看我为SimRunnerEntities添加的代码。我需要创建一个新的SimRunnerEntities,但是如果我的.config文件中没有名为SimRunnerEntities的连接字符串,那么显然会给我一个错误。 - runfastman
实际上,您不能使用SimRunnerEntities中的任何方法,因为它需要数据库连接。您需要断开数据库连接 - EF不支持此功能,据我所知。为了使其在没有连接的情况下工作,您需要添加自定义抽象级别,并编写一些逻辑(非常复杂),以手动保存数据库的副本并存储执行的所有命令,以便在将来复制它们时使用。也许有一些第三方解决方案可以解决这些问题,但肯定会很麻烦,特别是在尝试使所有内容同步时。 - Yura

1

是的,你可以这样做。

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

引用B,
A是WCF,并从B中复制配置以便它可以使用DBContext访问数据库。

C引用B,
C是WPF项目,实体是通过WCF从A中填充的,并且已经具有像EF自动生成的INPC之类的好处。


我在客户端唯一需要添加的是一个自定义类容器,其中包含实体类型的属性列表(即List Users {get;set;}等)


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

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

答:当然,B项目配置文件(app.config)根本没有被使用。
我只是为了存档或复制粘贴而将其放在那里。
我将它复制并粘贴到A项目的app.config中。

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

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

我认为你可能会问的下一个问题是如何从WCF向客户端传递数据 - 使实体“可跟踪”?为此,我创建了一个完整的DTO层..但这超出了您最初的问题范围 :)
关于简单的问题,您是否可以在不使用dbcontext管理它们的情况下使用实体的答案是:是的。


你能再解释一下吗?如果你的B项目有一个数据库连接,那么在没有数据库连接的情况下这个解决方案是如何工作的。在我的解决方案中,我有两个项目,一个用于数据,包括一个EF对象,另一个用于用户界面。在用户界面中,我想实例化一个数据对象,但没有有效的连接字符串,因为它包含一个EF项,所以失败了。 - runfastman
当然,我可以在答案中添加更多内容以进行更详细的解释。如果需要更多信息,请随时提问。 - G.Y
你能像我一样发布你的实体框架对象构造函数吗? - runfastman
我的构造函数很复杂,因为我创建了一个DTO层,用于与实体对象进行通信,但总的来说,每个EF对象都是部分类,所以我只需在同名的另一个代码文件中添加partial关键字并添加所需内容即可。在我的情况下,我派生了一个通用抽象类来处理DTO需求...它添加了CopyFromDto、CopyToDto和其他方法来处理删除等操作。 - G.Y
听起来有点复杂,但非常有用。你应该写一篇文章,并发布一个简单的例子来演示如何操作。我相信很多人会觉得它很有用。 - runfastman
会考虑那个想法的 :) - G.Y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接