发布
社区首页 >问答首页 >在SubSonic 3和MySQL中,在linq-query中使用属性时,从CleanUp()方法中的列名中删除下划线会导致异常

在SubSonic 3和MySQL中,在linq-query中使用属性时,从CleanUp()方法中的列名中删除下划线会导致异常
EN

Stack Overflow用户
提问于 2010-02-18 15:16:52
回答 1查看 1.3K关注 0票数 1

我在使用SubSonic 3(.0.0.3) ActiveRecord和MySQL时遇到了一个问题。

由于MySQL不允许在表名或列名中使用大写字母(或者更确切地说,如果您这样做就忽略大写字母),我决定使用下划线分隔单词,例如entity_id,然后使用CleanUp()方法添加标题大小写并删除下划线。

我的一个朋友写了一个ToTitleCase(string s)方法,看起来像这样:

代码语言:javascript
代码运行次数:0
复制
string ToTitleCase(string s)
{
    CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
    TextInfo textInfo = cultureInfo.TextInfo;
    return textInfo.ToTitleCase(s);
}

CleanUp()方法如下所示:

代码语言:javascript
代码运行次数:0
复制
string CleanUp(string tableName){
    string result=tableName;

    //strip blanks
    result=result.Replace(" ","");

    //put your logic here...
    result = ToTitleCase(result);
    result = result.Replace("_", "");

    return result;
}

如果我这样做了:

代码语言:javascript
代码运行次数:0
复制
var entity = Entity.All().Where(e => e.EntityName.Contains("John"));

我得到了一个NotSupportedException,消息是“不支持成员'EntityName‘”。

如果我删除

代码语言:javascript
代码运行次数:0
复制
result = result.Replace("_", "");

一切都很好,只是我得到的属性看起来像Entity_Id,这并不是我想要的。

如果有人知道为什么会这样,我很想听听。如果有可能修复,那就更好了!这并不是一场精彩的表演,但有点让人恼火。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-25 00:45:53

很多很多个月以来,这对我来说都是一个问题,当我在任何支持的DB上使用SubSonic时,我只是避免下划线。直到昨天,我不得不支持一个在SQL Server数据库中有下划线的遗留项目。

您必须在SubSonic.Core (文件:SubSonic.Core\Schema\DatabaseTable.cs)的源代码中修复它:

查找此方法:

代码语言:javascript
代码运行次数:0
复制
public IColumn GetColumnByPropertyName(string PropertyName)
{
    return Columns.SingleOrDefault(x => x.Name.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}

并将其更改为:

代码语言:javascript
代码运行次数:0
复制
public IColumn GetColumnByPropertyName(string PropertyName)
{
    return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}

接下来,您必须修改您的Structs.tt

在顶部附近找到这个:

代码语言:javascript
代码运行次数:0
复制
Columns.Add(new DatabaseColumn("<#=col.Name#>", this)
{
    IsPrimaryKey = <#=col.IsPK.ToString().ToLower()#>,
    DataType = DbType.<#=col.DbType.ToString()#>,
    IsNullable = <#=col.IsNullable.ToString().ToLower()#>,
    AutoIncrement = <#=col.AutoIncrement.ToString().ToLower()#>,
    IsForeignKey = <#=col.IsForeignKey.ToString().ToLower()#>,
    MaxLength = <#=col.MaxLength#>
});

然后添加这一行:

代码语言:javascript
代码运行次数:0
复制
    PropertyName = "<#=col.CleanName#>",

所以它变成了:

代码语言:javascript
代码运行次数:0
复制
Columns.Add(new DatabaseColumn("<#=col.Name#>", this)
{
    PropertyName = "<#=col.CleanName#>",
    IsPrimaryKey = <#=col.IsPK.ToString().ToLower()#>,
    DataType = DbType.<#=col.DbType.ToString()#>,
    IsNullable = <#=col.IsNullable.ToString().ToLower()#>,
    AutoIncrement = <#=col.AutoIncrement.ToString().ToLower()#>,
    IsForeignKey = <#=col.IsForeignKey.ToString().ToLower()#>,
    MaxLength = <#=col.MaxLength#>
});

问题是,一旦清理了列名,SubSonic就会尝试通过将SubSonic生成的属性名与数据库的原始列名进行匹配来查找查询中的有效列。

这些更改将确保SubSonic将它们与已清理的属性名称进行匹配。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2286884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档