【问题标题】:how to force sqlmetal to keep field name case?如何强制 sqlmetal 保持字段名称大小写?
【发布时间】:2010-01-04 12:07:56
【问题描述】:

当 dbml 文件由 Visual Studio 自动生成时,我会得到它们在表中出现的确切字段名称。

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

ses_Id -> Ses_Id
aga_Id -> Aga_Id

等等——它可能会将camelCase更改为CamelCase。

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

提前谢谢你。

已解决

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

【问题讨论】:

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


    【解决方案1】:

    我怀疑是否有隐藏开关。我遇到了同样的问题,所以我写了一个简单的 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
    

    【讨论】:

    • 看来很多人都写 dbmlhacker 包装器 :-) 我也写了我的——它也处理这个问题和其他问题(比如在值集上添加通知,而不仅仅是改变)。
    • 是的!这段 Perl 脚本只是回答您问题的精简版。我的完整脚本还解决了当存储过程通过 SELECT 返回一组记录时,主键和其他 NOT NULL 列在 DataContext 中显示为 Nullable 类型的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多