كيفية تعيين جزء من جدول ASPNET_USERS باستخدام nhibernate بطلاقة

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

سؤال

أحاول الحصول على Nhibernate 1.0 RTM بطلاقة لرسم خريطة كيان مستخدم بالنسبة لي حتى أتمكن من الوصول إلى UserId واسم المستخدم داخل تطبيق ASP.NET MVC عبر Nhibernate.

أملك:

public class User
{
    public virtual Guid UserId { get; protected set; }
    public virtual string UserName { get; protected set; }
}

يمثل جدول ASPNET_USERS مع فقط الأعمدة ذات الصلة التي سيتم تعيينها. هذا هو الكيان الوحيد الذي لم يتم تشغيله. ها هو رسم الخرائط الخاص بي:

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.UserId);
        Map(x => x.UserName);
        WithTable("aspnet_Users");
    }
}

كل شيء آخر هو الحصول على السيارات مع الاتفاقيات.

إليكم الابتدائي الخاص بي و TableNameConvention:

public class PrimaryKeyConvention : IIdConvention
{
    public void Apply(IIdentityInstance instance)
    {
        instance.Column(instance.Property.ReflectedType.Name + "Id");
        instance.UnsavedValue(System.Guid.Empty.ToString());
        instance.GeneratedBy.GuidComb();
    }
}

public class TableNameConvention : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        instance.Table(Inflector.Net.Inflector.Pluralize(instance.EntityType.Name));
    }
}

تفشل عملية التعيين مباشرة بعد تنفيذ رمز ClassMap (الذي يأتي قبل جميع السيارات) ، يليه رمز TableNameConvention ، يليه رمز PrimaryKeyConvention. الفشل في PrimaryKeyConvention لأن مثيل. حاولت القيام بعمل if (extue.property! = NULL) ولكن هذا ينهي عملية التعيين مبكرًا مع خطأ "الفئة" المطلوبة "الفئة المطلوبة". كان لدي أيضًا IF (extue.entitytype! = typeof (user)) في tableNameConvention ، لكنني خرجت عندما لم يحدث أي فرق.

ما الذي يجري هنا؟ بادئ ذي بدء ، لماذا تدعو عمليات السيارات إلى اتفاقيات خريطة الفصل؟ ثانياً ، لماذا يتم تمرير justkenconvention على سبيل المثال. كيف يمكنني تشغيل هذا الأمر بحيث تسير عملية التعيين وتخطط بقية كياناتاتي باستخدام اتفاقيات Automabing +؟

ملاحظة ، لقد عملت كل هذا لأشهر تحت إصدار سابق من FNH قبل Refactor لـ 1.0 RTM.

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

المحلول

لقد اكتشفت إجابة هذا.

public UserMap()
{
    Id(x => x.UserId);
    Map(x => x.UserName);
    Table("aspnet_Users");
}

public class PrimaryKeyConvention : IIdConvention
{
    public void Apply(IIdentityInstance instance)
    {
        instance.Column(instance.EntityType.Name + "Id");
        instance.UnsavedValue(System.Guid.Empty.ToString());
        instance.GeneratedBy.GuidComb();
    }
}

public class TableNameConvention : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        instance.Table(Inflector.Net.Inflector.Pluralize(instance.EntityType.Name));
    }
}

لاحظ أن PrimaryKeyConvention يعين اسم العمود باستخدام مثيل. entityname بدلاً من ذلك مثيل. هذا الأخير كان لاغية بالنسبة إلى USERMAP ، لذلك ستعطل.

هذا النهج أفضل من استخدام عبارة مشروطة على (NULL! = exate.property) والحفاظ على مثيل. إذا اخترت السير في هذا المسار ، فيجب عليك تعيين أسماء الأعمدة بشكل صريح في USERMAP:

public UserMap()
{
    Id(x => x.UserId).Column("UserId")
                     .GeneratedBy.Assigned();
    Map(x => x.UserName).Column("UserName");
    Table("aspnet_Users");
}

نصائح أخرى

لا أستخدم رسم الخرائط التلقائية بنفسي ، لكنني أعتقد أنك بحاجة إلى تعيين المستخدم من خلال التنفيذ iautomappingoverride. شيء مثل:

public class UserMap : IAutoMappingOverride<User>
{
    public void Override(AutoMapping<User> mapping)
    {
        mapping.Id(x => x.UserId);
        mapping.Map(x => x.UserName);
        mapping.WithTable("aspnet_Users");
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top