2016-03-11 48 views
0

我正在C#中开发一个数据密集型应用程序,并且需要关于管理我的数据的最佳方法的一些建议。我的应用程序将使用许多相关的表格,并在应用程序和数据库之间进行大量的移动。将数据库绑定到Collection c#

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

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

非常感谢

+1

你看过Entity Framework和Fluent API吗? –

+0

听起来像EF代码第一 – Byron

+0

@DanOrlovsky是的,只是看了EF的测试,尽管一个轻微的学习曲线一切似乎都很好。我也注意到我可以使用强类型的DataSet/DataAdaptors。任何建议哪种方法最好?我的经验是,数据集现在是旧派,EF是前进的方向? –

回答

1

Q.例如是否有可能在Visual Studio中轻松创建一个强类型数据层,将插入/更新/删除等后自动看?

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

EntityFramework通过DbContext对象将模型绑定到数据库,如果基于模型不存在,Code First甚至会生成一个数据库(如果存在并且模型更改,则可能需要迁移:More reading )。我将采取这种方法(您可以稍后将以下代码更改为连接字符串到实时数据库)。

首先,您需要告诉您的应用程序使用哪个数据库(无论它是否存在),并且这可以在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) -

MODELA和ModelB

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(必填,StringLength) - 这是真的很酷并且在您的模型上执行CRUD操作时可能非常有用。 也 - 实体框架将自动生成名为:Id(或任何情况下的形式)或ModelNameId主键的属性。有很多方法可以覆盖这个。

More reading on DataAnnotations

你甚至可以考虑建立关系,你的模型。如果MODELA将与ModelB一个一对多的关系,可以反映出在代码中这种关系:

public virtual ICollection<ModelB> 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

我将永远无法所有的细节,你可以做 - 但这里有几个短的例子:

问:这是什么都做什么?

现在,您已将强类型对象连接到数据库。这是因为创建一个新的上下文对象一样简单:

YourContext yourContext = new YourContext(); 

检索整个表一样简单:

IEnumerable<ModelA> modelAs = yourContext.ModelAs; 

或编号找到一个排

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()的调用;从上下文。否则他们将被丢弃。

当然,这可能是实体框架可用的最基本的概要。要看到更多的行动中检查出这些教程:

WebForms with Entity Framework - Wingtip Toys

MVC with Entity Framework - Contoso University

希望这可以有所帮助的人。

+0

感谢您花时间整理。仅供参考,它是我正在编写的本地桌面应用程序。我主要关心的是,我的软件处于开发初期阶段,而我以前的数据密集型应用程序(十年前在.NET 2.0中)的经验是,数据结构中的任何结构变化都证明是我更新的噩梦码。阅读以上和其他一些文章,似乎EF是前进的方向。欢呼 –

+0

@glenn - 这也适用于本机桌面应用程序。减少web.config部分 - 但使用app.config –