c# - ميديا - حل مشكلة تثبيت net framework فى ويندوز 7



التحكم في تعيين الأعمدة مع اتفاقية مخصصة في إنتيتي فريميورك 6 (1)

بقدر ما أستطيع أن أرى، يمكنك فقط كتابة تكوين نوع في أسلوب OnModelCreating من DbContext وهو مشابه جدا إلى التعليمات البرمجية التي سبق ذكرها في السؤال.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Types<TypeEntity>().Configure(c =>
    {
        c.HasKey(p => p.Key);
        // probably not needed, but won't do any harm
        c.Property(p => p.Key).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        c.ToTable(c.ClrType.Name);
    });
}

إذا كان هناك أي مشكلة مع هذا النهج، واسمحوا لي أن أعرف وأنا سوف إعادة زيارة هذا الموضوع.

تصحيح:

ويمكن تطبيق المبدأ نفسه بالضبط مع الاتفاقيات:

class TypeEntityConvention : Convention
{
    public TypeEntityConvention()
    {
        this.Types<TypeEntity>().Configure(c =>
        {
            c.HasKey(p => p.Key);
            c.Property(p => p.Key).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            c.ToTable(c.ClrType.Name);
        });
    }
}

و

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Conventions.Add<TypeEntityConvention>();
}

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

حاليا أفعل ذلك مع EntityTypeConfiguration لكل نوع كيان يشبه هذا:

class LineItemType : EntityTypeConfiguration<Models.LineItemType>
{
    public LineItemType()
    {
        this.Property(e => e.Key)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        this.Map(e => e.MapInheritedProperties()
                       .ToTable(nameof(LineItemType)));
    }
}

هذا يعمل بشكل جيد، ولكنه متكرر جدا. يجب أن أتذكر إنشاء فئة التكوين لكل نوع الذي يرث من TypeEntity ، تعيين المفتاح، وقم بتعيين الخصائص الموروثة. هذا يبدو وكأنه حالة مثالية Convention مخصصة.

قمت بإنشاء Convention TypeEntityTpcConvention كما يلي:

class TypeEntityTpcConvention : Convention
{
    public TypeEntityTpcConvention()
    {
        this.Types<TypeEntity>()
            .Configure(e => e.Property(p => p.Key)
                             .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity));
    }
}

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

من الناحية المثالية، أتوقع شيئا من هذا القبيل:

this.Types<TypeEntity>()
    .Configure(e => e.MapInheritedProperties()
    .ToTable(e.ClrType.Name));

أو حتى مكالمة من هذا القبيل لكل الممتلكات التي تحتاج إلى تعيينها:

this.Types<TypeEntity>()
    .Configure(e => e.Property(p=>p.Key)
                     .ToTable(e.ClrType.Name));

ولا يبدو أن أي منهما موجود. هل هناك أي طريقة بالنسبة لي للسيطرة على رسم خرائط الممتلكات من داخل Convention ؟

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

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





entity-framework-6