2016-03-11 51 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 –