什么是存储大量对象的好方法,这些对象将被持久修改/搜索?

时间:2016-05-19 13:11:46

标签: c# database winforms object

所以我为了学习而在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是正确的选项,并构建表单以便用户可以添加新的客户端和帐户以及修改或删除它们。

我的问题是,我不确定如何保存我的对象及其数据,因此在退出并重新启动程序后它仍然可用,而不会失去处理对象上的数据的能力-basis(比如使用setter方法修改数据)。如果它可以在不设置大量内容的情况下轻松发货,那将是很好的,因此我可以将我的应用程序发送给某人进行代码审查。有点像你可以在Visual Studio中设置本地数据库

也许我只是把自己搞糊涂了,而且我想错了方向,只是让我知道。谢谢你的帮助。

4 个答案:

答案 0 :(得分:3)

对于桌面应用程序中的数据库,

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

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

答案 1 :(得分:2)

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

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

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

作为实施数据访问层的附注,一个很好的选择是SQL Express或SQL Local DB,并使用Entity Framework将对象映射到数据库表并执行CRUD操作。

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

答案 2 :(得分:1)

在我看来,

实体框架是一个更好的选择。它为Windows应用程序提供了功能齐全的持久层

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

旁注

目前,EF目前的版本为6.1+,因此它是一款成熟的产品,也是微软建议在新的Windows应用程序中创建持久层的建议。实体框架核心(将取代6.1+)目前是RC2,所以不久之后,EF也将可用于Linux和MAC系统。

如何安装

右键单击您的项目,单击"管理NuGet包..."然后输入"实体框架"进入搜索栏。安装它,嘿嘿,你的应用程序(几乎)已准备好与Entity Framework持久层一起使用。

示例代码

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; }
}

答案 3 :(得分:1)

想到的选择:

1)使用序列化(XMl,二进制,Protobuf,JSON等)并将类序列化为文件,然后在需要时反序列化它们。优点是它非常易于使用,不需要第三方软件,并且内置于语言或第三方DLL(即不需要其他安装)。缺点:它是基于文件的,因此您不会拥有数据库为您提供的许多其他好处。

2)使用RDBMS或NoSQL数据库。它们设置起来很麻烦(在某些情况下可能是不可能的,或者因为客户端必须安装除核心应用程序之外的其他东西而不需要)并且可能是一种矫枉过正,但显然它比文件库解决方案更灵活。 / p>

既然你正在学习并为了好玩而这样做,我建议同时考虑两者:)。