【问题标题】:What are good ways to store large number of objects, that will be modified/searched, persistently?什么是存储大量对象的好方法,这些对象将被持久修改/搜索?
【发布时间】:2016-05-20 01:11:30
【问题描述】:

所以为了学习,我正在用 C# 编写某种银行软件。我有不同的课程,例如

class Client {
    int userID;
    string firstName;
    string lastName;
    string description;
    DateTime birthdate;
    string type;
    ....
}

class Account {
    int accountID;
    int userID;
    string type;
    DateTime runtime;
    DateTime opened;
    string description;
    ....
}

现在我想在图形界面(WinForms)中显示所有不同的数据,我认为DataGridView 是正确的选择,并构建表单以便用户可以添加新的客户和帐户以及修改或删除它们.

我的问题是我不确定如何保存我的对象及其数据,因此在退出并重新启动程序后它仍然可用,而不会失去基于对象处理数据的能力(例如修改数据使用 setter 方法)。如果它可以在不设置很多东西的情况下轻松交付,那就太好了,这样我就可以将我的应用程序发送给某人进行代码审查。有点像您可以在 Visual Studio 中设置本地数据库

也许我只是把自己弄糊涂了,我的想法错了,请告诉我。感谢您的帮助。

【问题讨论】:

  • 数据库是一个很好的存储选择,但比考虑数据库更好的是考虑使用数据访问层。

标签: c# database winforms object


【解决方案1】:

Sqlite 是桌面应用程序中数据库的不错选择。整个数据库是硬盘上的单个文件,数据库引擎在您的应用程序中运行,因此您无需安装任何软件即可运行。

this question 中,您可以找到适用于 sqlite 的可用 .net 库。

【讨论】:

    【解决方案2】:

    数据库是一个不错的存储选择,但比考虑数据库更好的是考虑使用数据访问层

    如果您使用数据访问层并将与数据相关的代码放在该层中,那么如果您更改了数据存储技术,您的应用程序将不会改变,所有更改都将在数据访问层中进行。

    您可以简单地实现与 SQL ServerOracleSqlite 甚至 Xml 文件一起使用的数据访问层。但是您的应用程序将不依赖于实现。

    作为数据访问层实现的附带说明,一个不错的选择是 SQL Express 或 SQL Local DB,并使用实体框架将对象映射到数据库表并执行 CRUD 操作。

    您会发现 Repository工作单元依赖注入 概念很有用。 通常,您应该使用接口进行数据访问并使用例如 EF 提供实现,然后将实现注入您的应用程序。

    【讨论】:

    【解决方案3】:

    在我看来,Entity Framework 是一个更好的选择。它为 Windows 应用程序提供了一个功能齐全的持久层

    https://msdn.microsoft.com/en-gb/data/ef.aspx

    旁注

    EF 目前处于 6.1+ 版本,因此它是一个成熟的产品,并且微软建议在新的 Windows 应用程序中创建持久层。 Entity Framework Core(将取代 6.1+)目前是 RC2,所以不久之后,EF 也将可用于 Linux 和 MAC 系统。

    如何安装

    右键单击您的项目,单击“管理 NuGet 包...”,然后在搜索栏中键入“实体框架”。安装它,嘿-presto,您的应用程序(几乎)准备好与实体框架持久层一起使用。

    示例代码

    public class Client {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Description { get; set; }
        public DateTime Birthday { get; set; }
        public string Type { get; set; }
        ...
    }
    
    public class Account {
        public int Id { get; set; }
        public Client Client { get; set; }
        public string Type { get; set; }
        public DateTime RunTime { get; set; }
        public DateTime Opened { get; set; }
        public string Description { get; set; }
        ...
    }
    
    public class ApplicationDbContext : DbContext
    {
        public ApplicationDbContext() : base("name=DefaultConnection")
        {
        }
    
        public DbSet<Account> Accounts { get; set; }
        public DbSet<Client> Clients { get; set; }
    }
    

    【讨论】:

      【解决方案4】:

      想到的选择:

      1) 使用序列化(XMl、Binary、Protobuf、JSON 等)并将您的类序列化为文件,然后在需要时对其进行反序列化。优点是它非常易于使用,不需要第三方软件,并且内置在语言或第三方 DLL 中(即不需要其他安装)。缺点:它是基于文件的,所以你不会有很多其他数据库给你的好处。

      2) 使用 RDBMS 或 NoSQL 数据库。它们设置起来很麻烦(并且在某些情况下可能是不可能的或不希望的,因为您的客户将不得不安装除核心应用程序之外的各种东西)并且可能有点矫枉过正,但显然它比基于文件的解决方案灵活得多。

      既然你是为了好玩而学习和做这件事,我建议你看看这两个:)。

      【讨论】:

        猜你喜欢
        • 2010-09-28
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 2013-04-09
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多