Trong nhiều tháng, đây là một vấn đề đối với tôi và tôi chỉ tránh dấu gạch dưới khi làm việc với SubSonic trên bất kỳ DB nào được hỗ trợ. Cho đến ngày hôm qua khi tôi phải hỗ trợ một dự án kế thừa có dấu gạch dưới trong cơ sở dữ liệu SQL Server của nó.
Bạn sẽ phải sửa nó trong mã nguồn của SubSonic.Core (tệp:SubSonic.Core \ Schema \ DatabaseTable.cs):
Tìm phương pháp này:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.Name.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
Và thay đổi nó thành:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
Tiếp theo, bạn sẽ phải sửa đổi Structs.tt :
Tìm cái này ở gần đầu:
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#>
});
Và thêm dòng này:
PropertyName = "<#=col.CleanName#>",
Vì vậy, nó trở thành:
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#>
});
Vấn đề là sau khi bạn xóa tên cột, SubSonic sẽ thử tìm các cột hợp lệ trong truy vấn của bạn bằng cách khớp với tên thuộc tính do SubSonic tạo của bạn. chống lại tên cột ban đầu của cơ sở dữ liệu .
Những thay đổi này sẽ đảm bảo rằng SubSonic khớp chúng với tên thuộc tính đã được làm sạch .