【问题标题】:Bind database to Collection c#将数据库绑定到集合 c#
【发布时间】:2016-03-11 14:04:16
【问题描述】:

我正在用 C# 开发一个数据密集型应用程序,需要一些关于管理数据的最佳方法的建议。我的应用程序将使用许多相关表,并在应用程序和数据库之间来回移动。

我的问题是,什么方法最适合处理数据?我的所有数据字段都在它们自己的类和集合中进行控制,因此,问题实际上更多是关于将我的集合和对象绑定到数据库的最佳方法是什么。

我应该手动创建自己的 SQL 连接/SQL 插入/更新查询,还是有其他方法可以做到这一点?例如,是否可以在 Visual Studio 中轻松创建强类型数据层,自动处理插入/更新/删除等?

非常感谢

【问题讨论】:

  • 你研究过 Entity Framework 和 Fluent API 吗?
  • 听起来像是EF代码优先
  • @DanOrlovsky 是的,刚刚看了 EF 并进行了测试,尽管有一点学习曲线,但一切似乎都很好。我还注意到我可以使用也是强类型的 DataSet / DataAdaptors。关于哪种方法最好的任何建议?我的经验是,数据集现在已经过时了,而 EF 是前进的方向?
  • 我将冒险投反对票,以尝试为您指明正确的方向 - 它不会以评论形式组织得很好,但是,这个问题非常广泛,可能属于另一部分SE的。等一下,我现在正在打字。

标签: c# .net database collections binding


【解决方案1】:

问。例如,是否可以在 Visual Studio 中轻松创建强类型数据层,自动处理插入/更新/删除等操作?

Entity Framework 听起来像是您正在寻找的东西。当然,其中涉及一些设置。对于大多数 Web 项目,Entity Framework 是自动添加的,如果没有,您可以随时通过 NuGet 包管理器添加它。

EntityFramework 通过 DbContext 对象将您的模型绑定到数据库,如果您的模型不存在,Code First 甚至会生成一个数据库(如果确实存在并且模型更改,您可能必须迁移:@987654321 @)。我将采用这种方法(您可以稍后将以下代码更改为与实时数据库的连接字符串)。

首先,您需要告诉您的应用程序使用什么数据库(无论它是否存在),这可以在 Web.Config 文件中完成(不是唯一的方法)。

Web.Config

<configuration>
  ....
  <connectionStrings>
    <add name="ConnectionStringName" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\DATABASENAME.mdf;Initial Catalog=DATABASENAME;Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>

注意 - 此连接字符串仅适用于 VS2015。对于以前的版本,请使用:

Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\DATABASENAME.mdf

More reading on configuring Entity Framework

现在,我们可以使用“ConnectionStringName”来连接我们的上下文。

Context 类必须继承自 DbContext 对象,我们将把这个连接字符串名称传递给基本构造函数(DbContext 存在于 System.Data.Entity 命名空间中)。我将使用两个看起来相同的通用模型(ModelA ModelB)--

模型A和模型B

using System.ComponentModels.DataAnnotations;

public class ModelA
{
    public int Id { get; set; }

    [Required(ErrorMessage="You need to enter a name!")]
    [StringLength(40)]
    public string Name { get; set; }
}

注意 - 我正在使用 DataAnnotations (Required, StringLength) - 这些真的很酷,在你的模型上实现 CRUD 操作时非常有用。 ALSO -- Entity Framework 将自动将名为:Id(或任何大小写形式)或 ModelNameId 的属性设为主键。有一些方法可以覆盖它。

More reading on DataAnnotations

您甚至可以在创建模型时考虑到关系。如果 ModelA 和 ModelB 会有一对多的关系,可以在代码中体现这种关系:

public virtual ICollection&lt;ModelB&gt; ModelBs {get; set;}

More reading on creating relationships

我们现在将使用 DbSet 集合将您的模型映射到表。看起来是这样的:

using System.Data.Entity;
using YourProject.Data.Models;

namespace YourProject.Data.DAL
{
    public class YourContext : DbContext
    {
        public YourContext() : base("ConnectionStringName")
        {

        }

        public DbSet<ModelA> ModelAs { get; set; }
        public DbSet<ModelB> ModelBs { get; set; }

    }
}

Database Initialization Strategies - 用于为您的数据库播种创建数据。

More reading on configuring the context

我永远无法详细说明您可以做的所有事情 - 但这里有一些简短的示例:

问。这一切有什么用?

您现在有一个强类型对象连接到您的数据库。就像创建一个新的 Context 对象一样简单:

YourContext yourContext = new YourContext();

检索整个表很简单:

IEnumerable<ModelA> modelAs = yourContext.ModelAs;

或按 Id 查找一行

ModelB modelB = yourContext.ModelBs.Find(id);

假设您抓取了 modelB 并想要更新它。很简单:

modelB.Name = "Here's the new name";
yourContext.Entry(modelB).State = EntityState.Modified;
yourContext.SaveChanges();

添加:

yourContext.ModelAs.Add(newModel);

删除:

yourContext.ModelBs.Remove(modelB);

记住 添加/更新/删除方法都需要调用 SaveChanges();从上下文。否则将被丢弃。

当然,这可能是可用的 Entity Framework 最基本的概要。要查看更多实际操作,请查看以下教程:

WebForms with Entity Framework - Wingtip Toys

MVC with Entity Framework - Contoso University

希望这可能对某人有所帮助。

【讨论】:

  • 感谢您花时间整理。仅供参考,这是我正在编写的本机桌面应用程序。我主要担心的是我的软件处于开发的初期阶段,而我之前对数据密集型应用程序(十年前在 .NET 2.0 中)的经验是,数据结构中的任何结构更改都被证明是在我的代码。阅读上述和其他几篇文章,似乎 EF 是前进的方向。干杯
  • @glenn - 这也适用于本机桌面应用程序。减少 web.config 部分 - 但使用 app.config
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 2016-10-18
  • 2013-12-24
  • 2012-03-11
  • 2012-06-14
  • 2011-04-07
  • 2011-06-28
  • 1970-01-01
相关资源
最近更新 更多