كيف يمكنك تلقائي قائمة <تعويم> أو تعويم [] مع أحمق بطلاقة؟

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

سؤال

بعد أن أصبحت عملية نموذجية نموذجية، بدأت الآن في القيام بعمل حقيقي مع أحمق بطلاقة - في محاولة لاستخدام الآي بالتميزات على فئة مشروعي.

إنه تطبيق للأجهزة العلمية، والفصول التي أقيم فيها تعيين العديد من الخصائص التي هي صفائف من العوامات

    private float[] _rawY; 
    public virtual float[] RawY 
    { 
        get 
        { 
            return _rawY; 
        } 
        set 
        { 
            _rawY = value; 
        } 
    } 

يمكن أن تحتوي هذه الصفائف على 500 قيم كحد أقصى.

لم أكن أتوقع التدوير للعمل على صفائف، لكنني جربها على أي حال، مع بعض النجاح في البداية. تم تعيين كل صفيف تلقائيا إلى Blob (باستخدام SQLite)، والذي يبدو وكأنه حل قابل للتطبيق.

جاءت المشكلة الأولى عندما حاولت الاتصال ب Savorupdate على الكائنات التي تحتوي على استثناءات "لا" استثناءات "لا ثابتة [].

لذلك كان فكرتي القادمة لتحويل جميع صفائفي إلى ilists على سبيل المثال

public virtual IList<float> RawY { get; set; } 

ولكن الآن أحصل على:

NHibernate.MappingException: Association references unmapped class: System.Single 

نظرا لأن السيارات يمكن أن تتعامل مع قوائم الكائنات المعقدة، فإنه لم يحدث أبدا بالنسبة لي لن يكون قادرا على تعيين قوائم الأنواع الأساسية. ولكن بعد القيام ببعض googling للحل، يبدو أن هذا هو الحال. يبدو أن بعض الناس قد حلوا المشكلة، لكن قانون عينة رأيته يتطلب المزيد من المعرفة ب Nhibernate أكثر من الآن - لم أفهم ذلك.

أسئلة:

1. كيف يمكنني جعل هذا العمل مع تلقائي؟

2. أيضا، هل من الأفضل استخدام صفائف أو قوائم لهذا التطبيق؟

يمكنني تعديل تطبيقي للاستخدام إما إذا لزم الأمر (على الرغم من أنني أفضل القوائم).

يحرر:

لقد درست الكود في تعيين مجموعة من السلاسل, وأرى هناك رمز الاختبار في المصدر الذي يحدد إيليست من سلاسل، على سبيل المثال

public virtual IList<string> ListOfSimpleChildren { get; set; }

[Test] 
public void CanSetAsElement() 
{ 
    new MappingTester<OneToManyTarget>() 
        .ForMapping(m => m.HasMany(x => x.ListOfSimpleChildren).Element("columnName")) 
        .Element("class/bag/element").Exists(); 
} 

لذلك يجب أن يكون هذا ممكنا باستخدام أتمتة نقية، لكنني كان لدي حظي حظا في الحصول على أي شيء للعمل، وربما لأنني لا أملك القلق المطلوب رسم الخرائط يدويا مع أحمق.

بدأت في الاعتقاد بأنني سأضطر إلى اختراق هذا (عن طريق ترميز مجموعة من العوامات كسلسلة واحدة، أو إنشاء فئة تحتوي على تعويم واحد ثم إجمالا في القوائم الخاصة بي)، ما لم يكن شخص ما يمكن أن يقول لي كيف أفعل ذلك بشكل صحيح.

End Edit.

ها هي طريقة الإبداعية الخاصة بي، إذا كان ذلك يساعد في صياغة الرد ...

    private static ISessionFactory CreateSessionFactory() 
    { 
        ISessionFactory sessionFactory = null; 


        const string autoMapExportDir = "AutoMapExport"; 
        if( !Directory.Exists(autoMapExportDir) ) 
            Directory.CreateDirectory(autoMapExportDir); 


        try 
        { 
            var autoPersistenceModel = 
                AutoMap.AssemblyOf<DlsAppOverlordExportRunData>() 
                       .Where(t => t.Namespace == "DlsAppAutomapped") 
                       .Conventions.Add( DefaultCascade.All() ) 
                ; 


            sessionFactory = Fluently.Configure() 
                .Database(SQLiteConfiguration.Standard 
                              .UsingFile(DbFile) 
                              .ShowSql() 
                         ) 
                .Mappings(m => m.AutoMappings.Add(autoPersistenceModel) 
                                             .ExportTo(autoMapExportDir) 
                         ) 
                .ExposeConfiguration(BuildSchema) 
                .BuildSessionFactory() 
                ; 
        } 
        catch (Exception e) 
        { 
            Debug.WriteLine(e); 
        } 


        return sessionFactory; 
    } 
هل كانت مفيدة؟

المحلول

منذ أن نشرت سؤالي، قام فريق Nibernate Blibernate بإصلاح هذه المشكلة.

يمكنك الآن تلقائيا تلقائيا من أنواع V # من أنواع الأقراط (السلاسل، والمجلس الدولي، العوامات، إلخ).

فقط تأكد من أن لديك نسخة حديثة من FNH.

يحرر

لقد قمت مؤخرا بالترقية من FNH 1.0 إلى FNH 1.3.

سيقوم هذا الإصدار أيضا بتصوير صفائف - تعويم []، INT []، إلخ.

يبدو أن خريطة لهم باعتبارها النقط. أفترض أن هذا سيكون أكثر كفاءة من الإرجال، لكنه لم يفعل أي جمهورية للتأكيد.

نصائح أخرى

ربما أرغب في علاقة واحدة على علاقة كثيرة وجعل القائمة طاولة أخرى ...

ولكن ربما تحتاج إلى إعادة التفكير في كائنك، هل هناك أيضا RAWX التي يمكنك تكوينها في نقطة RAW؟ هذا من شأنه أن يجعل الجدول مع 3 أعمدة (ParentID، X، Y).

يأتي التوقف من الرغبة في تعيين قائمة إلى قيمة أنه في RDBMS لن تذهب في عمود بدقة للغاية. الجدول هو حقا الطريقة التي يستخدمونها لتخزين قوائم البيانات.

هذه هي نقطة كاملة من استخدام orm مثل nhibernate. عند القيام بجميع تكوين الاستعلام و SQL باليد في التطبيق الخاص بك، كان لإضافة جدول تكلفة عالية في الصيانة والتنفيذ. مع التكلفة بتكلفة ما يقرب من 0، لذا استفد من نقاط قوة RDBMS واتركها بتخريبا عن القبح بعيدا.


أرى مشكلتك في تعيين الصفيف، جربه باستخدام رسم خرائط تجاوز أولا ومعرفة ما إذا كان سيعمل، فيمكنك أن تنشئ عملية تجاوز الاتفاقية إذا كنت تريد أن تعمل Automap.

.Override<MyType>(map =>
{
    map.HasMany(x => x.RawY).AsList();
})

لست متأكدا مما إذا كان ذلك سيعمل، أحتاج إلى إعداد إعداد اختبار أحمق تم تكوينه لهذه الأشياء.

في النهاية حصلت على تجاوز العمل - انظر نهاية قائمة التعليمات البرمجية. النقاط الرئيسية هي:

  • فئة رسم الخرائط الجديدة تسمى dlsappoverlordexporrundatamap
  • إضافة جملة الاستخدام Frompromsemblyof

أيضا، اتضح أن (على الأقل مع v 1.0.0.594) هناك big getcha مع السيارات - لا يمكن أن تكون فئة التعيين (مثل DLSAPPOVERLORDEXPORTRUNDATAMAP) في مساحة الاسم نفسها كصف المجال (مثل dlsappoverlordexporrundata)!

خلاف ذلك، سوف lhibernate رمي "nhibernate.mphapexception: (xmldocument) (2،4): خطأ التحقق من صحة XML: ..." مع أي مؤشر على الإطلاق حول ما أو أين المشكلة الحقيقية.

ربما يكون هذا خطأ، وقد يتم إصلاحه في الإصدارات الأحدث من أحمق بطلاقة.

namespace DlsAppAutomapped
{
    public class DlsAppOverlordExportRunData
    {
        public virtual int Id { get; set; }

        // Note: List<float> needs overrides in order to be mapped by NHibernate. 
        // See class DlsAppOverlordExportRunDataMap.
        public virtual IList<float> RawY { get; set; } 
    }
}


namespace FrontEnd
{
    // NEW - SET UP THE OVERRIDES
    // Must be in different namespace from DlsAppOverlordExportRunData!!!
    public class DlsAppOverlordExportRunDataMap : IAutoMappingOverride<DlsAppOverlordExportRunData>
    {
        public void Override(AutoMapping<DlsAppOverlordExportRunData> mapping)
        {
            // Creates table called "RawY", with primary key
            // "DlsAppOverlordExportRunData_Id", and numeric column "Value"
            mapping.HasMany(x => x.RawY)
                   .Element("Value");
        }
    }
}

    private static ISessionFactory CreateSessionFactory() 
    { 
        ISessionFactory sessionFactory = null; 


        const string autoMapExportDir = "AutoMapExport"; 
        if( !Directory.Exists(autoMapExportDir) ) 
            Directory.CreateDirectory(autoMapExportDir); 


        try 
        { 
            var autoPersistenceModel = 
                AutoMap.AssemblyOf<DlsAppOverlordExportRunData>() 
                       .Where(t => t.Namespace == "DlsAppAutomapped")

                       // NEW - USE THE OVERRIDES    
                       .UseOverridesFromAssemblyOf<DlsAppOverlordExportRunData>() 

                       .Conventions.Add( DefaultCascade.All() ) 
                ; 


            sessionFactory = Fluently.Configure() 
                .Database(SQLiteConfiguration.Standard 
                              .UsingFile(DbFile) 
                              .ShowSql() 
                         ) 
                .Mappings(m => m.AutoMappings.Add(autoPersistenceModel) 
                                             .ExportTo(autoMapExportDir) 
                         ) 
                .ExposeConfiguration(BuildSchema) 
                .BuildSessionFactory() 
                ; 
        } 
        catch (Exception e) 
        { 
            Debug.WriteLine(e); 
        } 


        return sessionFactory; 
    } 

لم تحصل على أي إجابات هنا أو على القائمة البريدية التي تعمل بالطلاقة التي تعمل بالفعل، لذلك إليك ما فعلته.

تنبعث منها مثل الاختراق الرهيبة، لكنها تعمل. (سواء كان سيتوسع إلى مجموعات البيانات الكبيرة يبقى أن نرى).

أولا، لقد لفت عقار تعويم (يسمى القيمة) في الفصل:

// Hack - need to embed simple types in a class before NHibernate
// will map them
public class MappableFloat
{
    public virtual int Id { get; private set; }
    public virtual float Value { get; set; }
}

أذكر بعد ذلك الخصائص في فصول أخرى تحتاج إلى قوائم العوامات

public virtual IList<MappableFloat> RawYMappable { get; set; }

يخلق Nibernate جدول قاعدة بيانات واحدة، مع مفاتيح أجنبية متعددة، على سبيل المثال

create table "MappableFloat" (
    Id  integer,
   Value NUMERIC,
   DlsAppOverlordExportRunData_Id INTEGER,
   DlsAppOverlordExportData_Id INTEGER,
   primary key (Id)
)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top