2009-08-25 62 views
2

使用VS2005最好的辦法,.NET 2.0,C#C#ado.net:映射數據庫字段屬性

大家好,

什麼是映射存儲過程柱到C#對象屬性的最佳方法與創造緊密耦合。

例如,我不喜歡做以下

DataRow row = Getmyrows(); 
MyObject.MyProperty1 = row["col1"]; 
MyObject.MyProperty2 = row["col2"]; 

所以,當在存儲過程中的列被改爲colxyz那麼二進制代碼將打破。解決這個問題的最佳做法是什麼?代碼示例會很有幫助,並提前致謝。

回答

1

我會查看OR映射器。 LINQ to SQL,nHibernate,Entity Framework,LLBLGen等。這些允許您通過XML或其他外部配置源來配置映射。他們中的大多數還提供了一種方法來將您的實體與持久性框架完全分離,從而使您的實體成爲POCO(普通舊CLR對象)。 OR映射器的另一個好處是它可以即時爲您生成SQL,從而使您能夠在很大程度上消除存儲的proc層,這也是可能導致問題的耦合(在代碼中以及在您的代碼中)數據庫模式)。

0

最好的解決方案是使用像NHibernate一樣的適當的O/RM,或者如果你可以解決「少」Linq到SQL或實體框架。但是,如果你必須這樣做,我建議使用IDataReader/SqlDataReader來代替(最簡單,最好的性能),但是如果你想以「難以實現的方式」來完成映射到列名的話,你將不會脫身。

+1

我實際上認爲EF v4.0現在比nHibernate更有能力。 EF v1.0通常是完全損失的,但隨着VS2010和.NET 4.0的發佈即將到來,Entity Framework是一個穩固的競爭者。 – jrista 2009-08-25 19:26:27

1

夫婦辦法:

  1. 如果你被迫堅持瓦特/ ADO.NET正確,使用strongly typed dataset。對象和數據結構之間的所有映射都放在它所屬的模式中。然後,你可以滋潤你的對象W /像這樣的代碼:

    MyObject.MyProperty1 = dataSet.TableName.PropertyName

  2. 我發現每個人都說過同樣的話我會去;-)帶有ORM。我知道不成熟的優化是一個滑坡,但你不可避免地會找到明確的路線。隨着您的需求變得越來越複雜,您不會後悔,並且您將會學到一種寶貴的技能,這在.NET領域顯然獲得了很大的動力。

-2

如果必須這樣做,並且不想使用ORM,請將列名稱映射存儲在xml文件中。

<appSettings> 
    <key="prop1" value="col1"> 
</appSettings> 

然後在代碼中做這樣的事情:

myObject.Prop1 = ConfigurationManager.AppSettings["prop1"].Value 

我知道它笨重,並且涉及從XML(或配置文件)讀取每個屬性,但它會奏效。

+0

不幸的是,他的代碼中仍然存在硬編碼字符串的問題,需要額外的管理xml文件的開銷? – 2009-08-26 15:03:44

+0

@joshua:他的擔心是「所以,當存儲過程中的列變爲colxyz然後二進制代碼將打破」... 與此解決方案,二進制不會中斷,因爲列名不包括在二進制文件,除非編譯時在二進制文件中包含XML。所以我的解決方案確實解決了他的擔憂我的答案確實說它笨重。這將是我的最後一個選擇。但它確實解決了他的擔憂,雖然不是很優雅。 – desigeek 2009-08-26 15:23:04

0

同事和我在2.0天后使用的方法是創建一個自定義屬性,我們用它來指定數據表中的字段名稱,並用它標記對象的屬性。然後建立一個通用的實體構建器,將數據讀取器作爲參數(EntityBuilder(IDataReader rdr));因爲它通過datareader工作,它會創建一個空的T,在類上反映,通過屬性獲取自定義屬性信息和類型,並基於該屬性設置值。

也有另一個自定義屬性,用於指定我們的插入和更新SPROC中使用的參數以自動填充參數。