Проблема была в SubSonic.Core, как я подозревал. Я скачал источник для него и в схеме/DatabaseTable.cs я должен был изменить функцию GetColumnByPropertyName
на что-то вроде этого:
public IColumn GetColumnByPropertyName(string PropertyName)
{
var c = Columns.SingleOrDefault(x => x.Name.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
if (c == null)
{
c=Columns.SingleOrDefault(x => CleanUpColumnName(x.Name).Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
if (c == null)
{
throw new NotSupportedException("Couldn't find column name");
}
}
return c;
}
private string CleanUpColumnName(string name)
{
//don't forget to change Settings.ttinclude:CleanUp when changing this function!
string result = name;
if (result.EndsWith("_id", StringComparison.OrdinalIgnoreCase))
{
result = result.Substring(0, result.Length - 3);
result += "RID";
}
return result;
}
Причина этого заключается в том, что, когда он пытается разрешить имя столбца к IColumn в соответствующая таблица все, что у него есть, это что-то вроде «FooID», и все столбцы имеют .Name
«Foo_id». Таким образом, я сделал это так, чтобы, если он не находит столбец в первый раз, тогда он будет запускать функцию CleanUp второй раз для каждого имени столбца, чтобы он мог найти совпадение.
Если кто-то из SubSonic читает это, я бы с удовольствием, если бы вы каким-то образом исправили эту ошибку или, по крайней мере, уведомили об этом. Обратите внимание на версию я использую (и источник я использую) является 3.0.0.4
EDIT:
На самом деле это гораздо сложнее, чем это.Мне пришлось добавить поле CleanName в IColumn и DataColumn в SubSonic, а затем заполнить CleanName с момента запуска шаблонов T4. Тогда я изменил строку выше что-то вроде
var c = Columns.SingleOrDefault(x => x.CleanName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
Тогда в большом количестве случайных местах, где я должен был изменить код так:
ParameterValue = settings[tbl.PrimaryKey.Name],
закодировать так:
ParameterValue = settings[tbl.PrimaryKey.CleanName],
I Я все еще не уверен, что все изменения внесены, но я могу обновлять, вставлять, выбирать и присоединяться, поэтому я бы сказал, что я близок, если нет.
Это, вероятно, не связано с вашей проблемой, но ваше регулярное выражение неверно. Если у вас есть что-то, называемое 'my_idea', то регулярное выражение будет соответствовать, а затем вы замените' dea' на 'ID', получив' my_iID'. Попробуйте использовать regex '' _id $ "' вместо этого, или даже лучше, просто скажите 'if (result.EndsWith (" _ id ", StringComparison.OrdinalIgnoreCase)). – Timwi
@ Тим, да, несвязанный, но спасибо, что работает намного лучше! – Earlz