استخدام AutoPersistenceModel الخاص بـ Fluent NHibernate ولكن مع التحميل الشديد في كائن واحد

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

سؤال

أنا أستخدم Fluent NHibernate من أجل تعيين الكيانات الخاصة بي تلقائيًا.

هذا هو الرمز الذي أستخدمه للتعيين التلقائي:

new AutoPersistenceModel()
  .AddEntityAssembly(Assembly.GetAssembly(typeof(Entity)))
  .Where(type => type.Namespace.Contains("Domain") && type.BaseType != null && type.BaseType.Name.StartsWith("DomainEntity") && type.BaseType.IsGenericType == true)
  .WithSetup(s => s.IsBaseType = (type => type.Name.StartsWith("DomainEntity") && type.IsGenericType == true))
  .ConventionDiscovery.Add(
      ConventionBuilder.Id.Always(x => x.GeneratedBy.Increment())
);

هذا يعمل بشكل جيد.لكنني الآن بحاجة إلى التحميل السريع في كائن واحد من نطاقي.وجد هذه الإجابة.ولكن عندما أقوم بإضافة السطر .ForTypesThatDeriveFrom<IEagerLoading>(map => map.Not.LazyLoad()) إلى الكود وتشغيله أحصل على الاستثناء التالي:

  • حدث خطأ أثناء محاولة إنشاء مستند التعيين لـ IEagerLoading

لاحظ أنني أستخدم واجهة (IEagerLoading) لوضع علامة على الكائنات التي أريد تحميلها بفارغ الصبر.

يمكن لأي شخص أن يساعد في كيفية القيام بذلك؟تذكر أنني أريد الاحتفاظ بوظيفة التعيين التلقائي.

شكرًا

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

المحلول

المشكلة التي تضربها هي ذلك ForTypesThatDeriveFrom<T> هو اسمه مضلل قليلا، وهذا يعني حقا ForMappingsOf<T>, ، لذلك فهو يحاول العثور على ClassMap<IEagerLoading> والذي من الواضح أنه غير موجود.

أعتقد أنك يجب أن تكون قادرًا على التعامل مع هذا بالعرف IClassConvention.هذا خارج رأسي، ولكن يجب أن يعمل:

public class EagerLoadingConvention : IClassConvention
{
  public bool Accept(IClassMap target)
  {
    return GetType().GetInterfaces().Contains(typeof(IEagerLoading));
  }

  public void Apply(IClassMap target)
  {
    target.Not.LazyLoad();
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top