天天看點

綜合應用WPF/WCF/WF/LINQ之二十九:代碼生成器之DBMLToCode

SqlMetal.exe這個程式自動生成的DataContext類有很多問題,導緻我們不能直接使用,是以我們有必要先生成DBML檔案,并做一些修改,然後再生成DataContext類。

  我們需要修改的有如下幾種情況:

  1、我們有自定義的Info類,但存儲過程又會生成新的Info類,我們需要一一更改為自己的Info類,并删除自動生成的Info類。

  2、我們有自定義的枚舉,我們需要在涉及到這些枚舉類型的地方一一修改為自定義的枚舉類型。

  3、當存儲過程中使用了sp_executesql語句時,SqlMetal.exe程式會認為傳回的不是一個結果集,而是一個Int,這時我們需要修改它的傳回類型。

  本系統的考慮的情況比較簡單,該代碼生成器假定關于這個Table的所有傳回類型都是一樣的,形如TableNameInfo。

  這樣一來,我們需要配置的,就隻有枚舉了。其它的幾種情況我們可以用程式處理:判斷Interface的傳回類型,如果是Info或者IList,就将DBML中該存儲過程的傳回類型改成自定義的Info類名。

  枚舉的配置如下:

    1 <?xml version="1.0" encoding="utf-8" ?>

    2 <root>

    3     <tables>

    4         <item name="Employee" field="EmployeeStatus" value="EmployeeStatusEnum" />

    5     </tables>

    6     <procedures>

    7         <item name="InsertEmployee" field="EmployeeStatus" value="EmployeeStatusEnum" />

    8         <item name="UpdateEmployeeByEmployeeId" field="EmployeeStatus" value="EmployeeStatusEnum" />

    9         <item name="GetEmployeesByFilter" field="EmployeeStatus" value="EmployeeStatusEnum" />

   10     </procedures>

   11 </root>

  具體代碼則相對比較簡單,請參考源代碼。

  值得注意的是,生成過程中,會在程式中調用SqlMetal.exe程式,将DBML檔案轉為DataContext類,删除無用的自動生成的Info類,必須要等該DataContext類生成之後才能進行。

本文轉自 Eallies 51CTO部落格,原文連結:http://blog.51cto.com/eallies/79010,如需轉載請自行聯系原作者