إنفاذ nhibernate بطلاقة غير قابلة للإشارة إلى المرجع المفتاح الخارجي

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

سؤال

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

لقد قمت ببعض البحث على Stackoverflow ووجدت أسئلة مماثلة ، ولكن لا شيء يتعلق بالأوتوماتيكي والاتفاقيات (ما لم فاتني ذلك).

مثال سريع ...

public class Group    // One Group
{
    public Group() { this.Jobs = new List<Job>(); }
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Job> Jobs { get; protected set; }
}

public class Job    // Has many Jobs
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }

    // Trying to make this field not-nullable in the database.
    public virtual Group Group { get; set; }
}

اعتقدت أنني سأكون قادرًا على إنشاء اتفاقية مثل ...

public class OneToManyConvention : IHasOneConvention
{
    public void Apply(IOneToOneInstance instance)
    {
        // Nullable() isn't a valid method...
        instance.Not.Nullable();   
    }
}

ولكن يبدو أن ionetooninstance ليس لديه طريقة لاغية (). يمكنني القيام بذلك إذا قمت بإنشاء ملف خريطة للوظيفة ، ولكن محاولة تجنب أي ملفات خريطة والتمسك بالخرائط التلقائية.

جئت عبر هذا رابط على قائمة المجموعة بطلاقة وصف شيء مشابه.

الذي يصف شيئًا كهذا ...

public class NotNullPropertyConvention : IPropertyConvention
{
    public bool Accept(IProperty target)
    {
            return true;
    }
    public void Apply(IProperty target)
    {
            target.Not.Nullable();
    }
}

لكن هذا يثير أسئلة ... 1) كيف يمكنني تحديد iProperty ليكون وظيفة (أو أي ممتلكات طفل تعود إلى الوالد)

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

أي أفكار حول هذا؟ هل أفتقد شيئًا ما؟



تحديث 1

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

public class FluentConvention : IPropertyConvention
{
    public void Apply(IPropertyInstance instance)
    {
        instance.Not.Nullable();
    }
}

إنها تفعل لجميع الحقول الأخرى ...
/تجاهل

أيه أفكار؟



تحديث 2

على الرغم من أن هذا ليس هو الإجابة التي كنت أبحث عنها ، إلا أنني وجدت عملًا حوله ... كنت أستخدم مجموعة التحقق من Nhibernate ، وضمن تلك التجميع هناك سمة [notnull]. إذا قمت بتزيين صفي مع سمة المدقق ، وترتبط بمقال الصحة إلى nhibernate قبل إنشاء المخطط ، فإنه سيؤدي إلى وضع علامة على عمود قاعدة بيانات FK على أنه غير قابل للإلغاء.

public class Job    // Has many Jobs
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }

    [NHibernate.Validator.Constraints.NotNull]
    public virtual Group Group { get; set; }
}

إذا احتاج أي شخص إلى الكود الكامل لتهيئة NHIBERNATE + ValateedEngine ، فما عليك سوى إخبارنا بذلك. لا تزال تبحث عن طريقة للقيام بذلك باستخدام مسار مؤتمر التعيين الخالص على الرغم من أن أي شخص لديه أي معلومات ...

شكرًا!

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

المحلول

يمكنك تجاوز الخصائص المُعين تلقائيًا كجزء من السيارات الخاصة بك في fluenttly.configure ().

لذلك يمكنك القيام بذلك:

.Override<Job>(map => map.References(x => x.Group).Not.Nullable())

إنه ليس مناسبًا تمامًا إذا كان لديك الكثير من الفصول التي تحتاج إلى ذلك.

تعديل: يمكنك أيضًا تحديد التجاوز في فئة تنفذ iautomappingoverride مثل ذلك:

    public class JobMappingOverride : IAutoMappingOverride<Job>
    {
            public void Override(AutoMapping<Job> mapping)
            {
                    mapping.References(x => x.Group).Not.Nullable();
            }
    }

وتضمينه مثل ذلك:

    .UseOverridesFromAssemblyOf<JobMappingOverride>()

هذا من شأنه أن يحافظ على تكوينك بطلاقة نظافة قليلا.

نصائح أخرى

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

جرب هذا:

public class FluentConvention : IPropertyConvention, IReferenceConvention  
{      
    public void Apply(IPropertyInstance instance)
    {          
        instance.Not.Nullable();      
    }

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