Subsic 3 و MySQL ، إزالة السطح السفلي من اسم العمود في طريقة التنظيف () يسبب استثناءات عند استخدام خاصية في Query LINQ

StackOverflow https://stackoverflow.com/questions/2286884

سؤال

لقد واجهت مشكلة عند استخدام Subund 3 (.0.0.3) ActivereCord مع MySQL.

نظرًا لأن MySQL لا تسمح لك باستخدام أحرف كبيرة في الجدول أو أسماء الأعمدة (أو بالأحرى يتجاهلها إذا قمت بذلك) قررت فصل الكلمات باستخدام السموات السفلية ، على سبيل المثال entity_id ، ثم استخدم طريقة التنظيف () لإضافة غلاف العنوان وإزالتها السفلية.
كتب أحد الأصدقاء طريقة TotitleCase (سلسلة S) التي تبدو هكذا:

string ToTitleCase(string s)
{
    CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
    TextInfo textInfo = cultureInfo.TextInfo;
    return textInfo.ToTitleCase(s);
}

وطريقة التنظيف () تبدو هكذا:

string CleanUp(string tableName){
    string result=tableName;

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

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

    return result;
}

إذا قمت بذلك:

var entity = Entity.All().Where(e => e.EntityName.Contains("John"));

أحصل على notsupportedException ، مع رسالة "العضو" EntityName "غير معتمد."

إذا أزلت

result = result.Replace("_", "");

كل شيء يعمل بشكل جيد ، فقط أحصل على خصائص تبدو مثل entity_id وهو ما لا أريده تمامًا.

إذا كان أي شخص يعرف سبب حدوث هذا ، أحب أن أسمع ذلك. إذا كان من الممكن إصلاح ، حتى أفضل! إنه ليس عرضًا ولكنه مزعج بعض الشيء.

هل كانت مفيدة؟

المحلول

لعدة أشهر عديدة ، كانت هذه مشكلة بالنسبة لي وتجنبت فقط السطح السفلي عند العمل مع Subsic على أي ديسيبل مدعوم. حتى يوم أمس عندما اضطررت إلى دعم مشروع قديم كان قد أكد في قاعدة بيانات SQL Server الخاصة به.

سيتعين عليك إصلاحه ضمن الكود المصدري لـ Subonic.core (ملف: subonic.core schema databasetable.cs):

ابحث عن هذه الطريقة:

public IColumn GetColumnByPropertyName(string PropertyName)
{
    return Columns.SingleOrDefault(x => x.Name.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}

وتغييره إلى:

public IColumn GetColumnByPropertyName(string PropertyName)
{
    return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}

بعد ذلك ، يجب عليك تعديل الخاص بك structs.tt:

ابحث عن هذا بالقرب من الأعلى:

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#>
});

وأضف هذا الخط:

    PropertyName = "<#=col.CleanName#>",

بحيث يصبح:

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#>
});

المشكلة هي أنه بمجرد تنظيف أسماء الأعمدة ، يحاول Subsic Sund العثور على الأعمدة الصالحة في استعلامك من خلال مطابقة SubSION التي تم إنشاؤها أسماء الممتلكات مقابل الأصلي لقاعدة البيانات أسماء الأعمدة.

سوف تتأكد هذه التغييرات من أن Subson اسم الخاصية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top