SqlMetal.exe这个程序自动生成的DataContext类有很多问题,导致我们不能直接使用,所以我们有必要先生成DBML文件,并做一些修改,然后再生成DataContext类。
我们需要修改的有如下几种情况:
1、我们有自定义的Info类,但存储过程又会生成新的Info类,我们需要一一更改为自己的Info类,并删除自动生成的Info类。
2、我们有自定义的枚举,我们需要在涉及到这些枚举类型的地方一一修改为自定义的枚举类型。
3、当存储过程中使用了sp_executesql语句时,SqlMetal.exe程序会认为返回的不是一个结果集,而是一个Int,这时我们需要修改它的返回类型。
本系统的考虑的情况比较简单,该代码生成器假定关于这个Table的所有返回类型都是一样的,形如TableNameInfo。
这样一来,我们需要配置的,就只有枚举了。其它的几种情况我们可以用程序处理:判断Interface的返回类型,如果是Info或者IList,就将DBML中该存储过程的返回类型改成自定义的Info类名。
枚举的配置如下:
具体代码则相对比较简单,请参考源代码。
值得注意的是,生成过程中,会在程序中调用SqlMetal.exe程序,将DBML文件转为DataContext类,删除无用的自动生成的Info类,必须要等该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类生成之后才能进行。
转载于:https://blog.51cto.com/eallies/79010