如何强制sqlmetal保持字段名称大小写?

时间:2010-01-04 12:07:56

标签: linq visual-studio linq-to-sql sqlmetal

当Visual Studio自动生成dbml文件时,我会得到表中显示的确切字段名称。

但是,由于VS没有为dbml提供刷新功能,我手动运行sqlmetal来重新创建dbml文件。它有一个例外 - sqlmetal“更正”名称

ses_Id -> Ses_Id
aga_Id -> Aga_Id

依此类推 - 它可能会将camelCase更改为CamelCase。

Sqlmetal帮助没有列出任何开关来保持字段名称按原样(只有复数开关)。那么,是否有人知道隐藏的开关以保持字段名称的大小写?

提前谢谢。

解决

没有这样的开关,并且MS被通知了这个问题 - 添加这样的功能的愿望报告(因为它更新了项目的问题)被关闭为wontfix: - (

1 个答案:

答案 0 :(得分:4)

我怀疑是否有隐藏的开关。我有同样的问题,所以我写了一个简单的Perl脚本来解决它:

# Usage: fdbml.pl in.dbml out.dbml
my $in_file = $ARGV[0];
my $out_file = $ARGV[1];

# Scrape in file for identifiers
my @identifiers;
open IN, "<$in_file";
while (<IN>) {
    if ($_ =~ /<Table Name="(?:\w+\.)?(\w+)" Member="(\w+)"/) { push @identifiers, "$1 $2"; }
    if ($_ =~ /<Function Name="(?:\w+\.)?(\w+)" Method="(\w+)"/) { push @identifiers, "$1 $2"; }
}
close IN;

# Translate in file to out file
open IN, "<$in_file";
open OUT, ">$out_file";
while (<IN>) {
    my $line = $_;

    # Replace identifiers
    foreach my $identifier (@identifiers) { 
        my ($new, $old) = split(' ', $identifier);
        $line =~ s/"$old((?:Result)?)"/"$new$1"/g;
    }   
    $line =~ s/<Parameter Name="(\w+)" Parameter="\w+"/<Parameter Name="$1" Parameter="$1"/;

    print OUT $line;
}
close OUT;
close IN;

将所有内容保存到fdbml.pl,确保安装了ActiveState Perl,然后在DBML文件上运行:

fdbml.pl old.dbml new.dbml