سؤال

ملخص:

أريد حفظ فصلين من نفس الاسم واسم أعداد المسامع المختلفة باستخدام Automapper BliPernate Blibernate

سياق الكلام

أنا أكتب الاضطرار إلى استيراد الكثير من الأشياء المختلفة إلى قاعدة البيانات للاختبار. سأكتب في النهاية عن طراز مناسب.

لقد كنت أستخدم رمز GEN و BLUNT LOHIBERNATE لاتخاذ هذه DTOS وتفريغها مباشرة إلى DB.

لا يقول الاستثناء (حاول استخدام Auto-Import = "False")

رمز

public class ClassConvention : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        instance.Table(instance.EntityType.Namespace.Replace(".", "_"));
    }
}

namespace Sample.Models.Test1
{
    public class Test
    {
        public virtual int Id { get; set; }
        public virtual string Something { get; set; }
    }
}

namespace Sample.Models.Test2
{
    public class Test
    {
        public virtual int Id { get; set; }
        public virtual string SomethingElse { get; set; }        
    }
}

وهنا رمز التطبيق الفعلي

            var model = AutoMap.AssemblyOf<Service1>()
                .Where(t => t.Namespace.StartsWith("Sample.Models"))
                .Conventions.AddFromAssemblyOf<Service1>();
            var cfg = Fluently.Configure()
                .Database(
                MySQLConfiguration.Standard.ConnectionString(
                    c => c.Is("database=test;server=localhost;user id=root;Password=;")))
                .Mappings(m => m.AutoMappings.Add(model))
                .BuildConfiguration();
            new SchemaExport(cfg).Execute(false, true, false);

شكرا أنا أقدر حقا أي مساعدة

تحديث باستخدام nhibernate بطلاقة rc1

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

المحلول

حل من منتديات أحياب بطلاقة بواسطة جيمس غريغوري

حصلت حولها لإلقاء نظرة مناسبة على هذه الليلة. في الأساس، هو وصولا الى الاشياء autoimport الاستثناء المذكور؛ عندما يتم إعطاء Thhiberernate أول تعيين يرى أن الكيان يسمى اسم مؤهل التجميع الكامل ويخلق استيرادا للاسم القصير (أن تكون مفيدا!)، ثم عند إضافة الثانية، فإن ذلك يشكو من أن هذه الاستيراد هي الآن الذهاب إلى الصراع. وبالتالي فإن الحل هو إيقاف استيراد السيارات؛ لسوء الحظ، ليس لدينا طريقة للقيام بذلك في RC ... لقد ارتكبت فقط إصلاحا يضيف في القدرة على تغيير هذا في اتفاقية. لذلك إذا حصلت على أحدث ثنائيات أو مصدر، يجب أن تكون قادرا على تغيير خط الاتفاقيات الخاصة بك في مشروعك المرفق للقيام بذلك:

.Conventions.Setup(x =>  {   
  x.AddFromAssemblyOf<Program>();   
  x.Add(AutoImport.Never());  }); 

مما يضيف جميع الاتفاقيات التي حددتها في تجميعك، ثم يستخدم أحد اتفاقيات المساعد لإيقاف استيراد السيارات.

نصائح أخرى

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

public class AMap : ClassMap<A> 
{
    public AMap()
    {
        HibernateMapping.Not.AutoImport();
        Map(x => x.Item, "item");
        ...
    }
}

أواجه مشكلة حقيقية مع هذا، والمثال أعلاه أو أي من المتغيرات لا يساعدون.

var cfg = new notifyfluentnibernateconfiguration ()؛

    return Fluently.Configure()
      .Database(
       FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2005
            .ConnectionString("Server=10.2.65.227\\SOSDBSERVER;Database=NotifyTest;User ID=NHibernateTester;Password=test;Trusted_Connection=False;")
      )

      .Mappings(m => {
          m.AutoMappings
            .Add(AutoMap.AssemblyOf<SubscriptionManagerRP>(cfg));
          m.FluentMappings.Conventions.Setup(x =>
          {
              x.AddFromAssemblyOf<Program>();
              x.Add(AutoImport.Never());
          });
      } )

      .BuildSessionFactory();

لا أستطيع العثور على مرجع البرنامج ..

لقد حاولت أيضا اخماد ملف XML منفصل في تكوين إياج في رسم الخرائط بطلاقة التغير في الاستيراد التلقائي = خطأ بدون نجاح.

هل يمكنني الحصول على بعض المثال الأكثر شمولا حول كيفية القيام بذلك؟

تحرير، حصلت على آخر جذع قبل أسابيع فقط.

تحرير، حلها عن طريق إزالة جميع التكرارات.

لقد قضيت نفس المشكلة. حلها مثل هذا:

Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008
            .ConnectionString(...)
            .AdoNetBatchSize(500))
        .Mappings(m => m.FluentMappings
            .Conventions.Setup(x => x.Add(AutoImport.Never()))
            .AddFromAssembly(...)
            .AddFromAssembly(...)
            .AddFromAssembly(...)
            .AddFromAssembly(...))
        ;

الجزء المستوردة هو: .Conventions.Setup(x => x.Add(AutoImport.Never())). وبعد يبدو أن كل شيء يعمل بشكل جيد مع هذا التكوين.

استخدم ال PrefbindMaping. الحدث للوصول إلى تمثيل كائن ملفات .hbm XML.

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

إليك حل عالمي لتكرار مشاكل رسم الخرائط (فقط تذكر أن جميع استفسارات HQL ستحتاج الآن إلى استخدام أسماء أنواع مؤهلة بالكامل بدلا من أسماء الفئة فقط).

var configuration = new NHibernate.Cfg.Configuration();

configuration.BeforeBindMapping += (sender, args) => args.Mapping.autoimport = false;

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

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

هنا هو كيف تجمع كل التعيين يبدو وكأنه:

internal static class NHIbernateUtility
{
    public static ISessionFactory CreateSessionFactory(string connectionString)
    {
        return Fluently.Configure()
            .Database(
                MsSqlConfiguration
                    .MsSql2008
                    .ConnectionString(connectionString))
            .Mappings(m => m.AutoMappings
                .Add(ProjectA.NHibernate.PersistenceMapper.CreatePersistenceModel()))
            .Mappings(m => m.AutoMappings
                .Add(ProjectB.NHibernate.PersistenceMapper.CreatePersistenceModel()))
            .Mappings(m => m.AutoMappings
                .Add(ProjectC.NHibernate.PersistenceMapper.CreatePersistenceModel())).BuildSessionFactory();
    }
}

وواحد من مابيس الثبات:

public static class PersistenceMapper
{
    public static AutoPersistenceModel CreatePersistenceModel()
    {
        return
            AutoMap.AssemblyOf<Credential>(new AutoMapConfiguration())
                .IgnoreBase<BaseEntity>()
                .Conventions.Add(AutoImport.Never())
                .Conventions.Add<TableNameConvention>()
                .Conventions.Add<StandardForeignKeyConvention>()
                .Conventions.Add<CascadeAllConvention>()
                .Conventions.Add<StandardManyToManyTableNameConvention>()
                .Conventions.Add<PropertyConvention>();
    }
}

يشبه رسخات الثبات مشابهة جدا لكل مساحة اسم بوكو - بعضها يتجاوز. اضطررت إلى إضافة .conventions.add (autoimport.never ()) لكل مخطط الثبات ويعمل مثل سحر.

أردت فقط مشاركة هذا إذا كان أي شخص آخر يفعله بهذه الطريقة.

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