সাবলীল এনএইচবারনেট সহ আপনি কোনও এনামকে কী মান হিসাবে মানচিত্র করবেন?


88

প্রশ্ন এটিকে সত্যই বলেছে, এটি মানচিত্রের জন্য পূর্বনির্ধারিত তবে এটি হিসাবে মানচিত্রের stringপ্রয়োজন আমার int

আমি বর্তমানে PersistenceModelআমার সম্মেলনগুলি সেট করার জন্য ব্যবহার করছি যদি এতে কোনও পার্থক্য আসে। আগাম ধন্যবাদ.

আপডেটটি খুঁজে পাওয়া যায় যে ট্রাঙ্ক থেকে কোডের সর্বশেষতম সংস্করণে প্রবেশ করা আমার সমস্যাগুলি সমাধান করেছে।


4
যদি আপনি নিজেই সমস্যাটি সমাধান করেন তবে আপনার উত্তর দেওয়া উচিত, তবে এটি সঠিক উত্তর হিসাবে চিহ্নিত করুন যাতে ভবিষ্যতে অনুসন্ধানকারীরা এটি খুঁজে পেতে পারেন।
জেফ মার্টিন

আপনি উত্তর পোস্ট করতে পারেন?
mxmissile

ছেলেরা। দেরি করার জন্য দুঃখিত. আমি ঠিক নিশ্চিত ছিলাম না যে এমন প্রশ্নটি নিয়ে আমার কী করা উচিত যা আমি কেবল গ্রন্থাগারগুলির সর্বশেষতম সংস্করণ প্রয়োজন বলে একটি প্রশ্নবিদ্ধ নয় was
গ্যারি শাটলার

4
গুগল বটসের জন্য খাবার: আমার এনাম ম্যাপিংয়ের জন্য এটি প্রয়োগ করার আগে আমি "লোডিং সংগ্রহে অবৈধ অ্যাক্সেস" পাচ্ছিলাম।
ইঞ্চি

উত্তর:


84

এই সম্মেলনের সংজ্ঞা দেওয়ার উপায়টি কখনও কখনও আগে পরিবর্তিত হয়েছিল, এটি এখন:

public class EnumConvention : IUserTypeConvention
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType.IsEnum);
    }

    public void Apply(IPropertyInstance target)
    {
        target.CustomType(target.Property.PropertyType);
    }
}

4
এটি সাবলীল নিবারনেটের সাম্প্রতিকতম সংস্করণের সঠিক উত্তর
সান চেম্বারস

4
দেখে মনে হচ্ছে এটি সমস্ত এনাম ধরণের জন্য সূক্ষ্মভাবে কাজ করে, তবে আপনি যদি কিছু স্ট্রিং এবং কিছুকে ইনস হিসাবে চান? আমি মনে করি এটি সম্পত্তি ম্যাপিং স্তরে কনফিগারযোগ্য হওয়া উচিত।
ক্রিস

4
নীচে @ স্পটআপের উত্তরটি দেখুন যা অবিরাম এনামগুলিকে অনুমতি দেওয়ার জন্য এটি প্রসারিত করে। stackoverflow.com/questions/439003/…
জন অ্যাডামস 1

45

সুতরাং, যেমনটি উল্লেখ করা হয়েছে, ফ্লাট এনএইচবারনেটটির সর্বশেষতম সংস্করণটি ট্রাঙ্ক থেকে সরিয়ে দিয়ে আমাকে যেখানে আমার দরকার সেখানে পৌঁছেছে। সর্বশেষ কোড সহ এনুমের জন্য ম্যাপিংয়ের একটি উদাহরণ:

Map(quote => quote.Status).CustomTypeIs(typeof(QuoteStatus));

কাস্টম টাইপ এটিকে এনাম ব্যবহারের পরিবর্তে এনামের উদাহরণ হিসাবে পরিচালনা করতে বাধ্য করে GenericEnumMapper<TEnum>

আমি আসলে একটি প্যাচ জমা দেওয়ার বিষয়টি বিবেচনা করছি যা এনাম ম্যাপারের মধ্যে পরিবর্তন আনতে সক্ষম যা একটি স্ট্রিং অবিরত থাকে এবং এমন একটি যা একটি প্রান্ত অবিরত থাকে যা মনে হয় যে আপনি কোনও কনভেনশন হিসাবে সেট করতে সক্ষম হবেন like


এটি আমার সাম্প্রতিক ক্রিয়াকলাপের উপরে উঠে গেছে এবং এটিকে আরও সহজ করার জন্য ফ্লুয়েন্ট এনএইচবারনেটের নতুন সংস্করণে জিনিসগুলি পরিবর্তিত হয়েছে।

সমস্ত এনামগুলিকে পূর্ণসংখ্যা হিসাবে ম্যাপ করা যায় আপনি এখন এর মতো একটি কনভেনশন তৈরি করতে পারেন:

public class EnumConvention : IUserTypeConvention
{
    public bool Accept(IProperty target)
    {
        return target.PropertyType.IsEnum;
    }

    public void Apply(IProperty target)
    {
        target.CustomTypeIs(target.PropertyType);
    }

    public bool Accept(Type type)
    {
        return type.IsEnum;
    }
}

তারপরে আপনার ম্যাপিংটি কেবলমাত্র:

Map(quote => quote.Status);

আপনি এইভাবে আপনার ফ্লাইট এনএইচবারনেট ম্যাপিংয়ে কনভেনশনটি যুক্ত করুন;

Fluently.Configure(nHibConfig)
    .Mappings(mappingConfiguration =>
    {
        mappingConfiguration.FluentMappings
            .ConventionDiscovery.AddFromAssemblyOf<EnumConvention>();
    })
    ./* other configuration */

4
ডিফল্ট হিসাবে "int মোড" দিয়ে with কে স্ট্রিং হিসাবে enums অবিরত ?!
অ্যান্ড্রু বুলক

4
ইতিমধ্যে সেখানে স্ট্রিং মান সহ একটি উত্তরাধিকার ডাটাবেস হতে পারে
ক্রিস হেইনেস

4
+1 হাইনেসি @ অ্যান্ড্রু বুলক: আপনার প্রশ্নের উত্তর: যে কেউ রিয়েল ওয়ার্ল্ড ডাটাবেস নিয়ে কাজ করে।
স্কাই স্যান্ডার্স

এফএন-তে কোনও আইপ্রোপার্টি ইন্টারফেস আছে কি?
টিয়ান ডো

40

অযোগ্য এনামগুলি (পছন্দ করুন ExampleEnum? ExampleProperty) সম্পর্কে ভুলবেন না ! তাদের আলাদাভাবে পরীক্ষা করা দরকার। এটি নতুন এফএনএইচ স্টাইল কনফিগারেশন দিয়ে এভাবে করা হয়েছে:

public class EnumConvention : IUserTypeConvention
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType.IsEnum ||
            (x.Property.PropertyType.IsGenericType && 
             x.Property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) &&
             x.Property.PropertyType.GetGenericArguments()[0].IsEnum)
            );
    }

    public void Apply(IPropertyInstance target)
    {
        target.CustomType(target.Property.PropertyType);
    }
}

4
+1 এই সংযোজন জন্য! প্রথম সংস্করণটি অযোগ্য এনামগুলির জন্য কাজ করে না (তারা স্ট্রিং হিসাবে থাকবে) remain
লংদা

@ স্পটআপY ডাটাবেসে কলামের ধরণটি রয়েছে int? এবং টাইপ পতাকা গ্রহণ যখন? লাইক:MyEnum.Active | MyEnum.Paused
রাইডারম্যানসবিব

: @RidermandeSousaBarbosa: পতাকা জানতে এখানে পরীক্ষা stackoverflow.com/questions/2805661/...
SztupY

25

এইভাবে আমি কোনও মান সংখ্যার সাথে এনাম সম্পত্তি ম্যাপ করেছি:

Map(x => x.Status).CustomType(typeof(Int32));

আমার জন্য কাজ কর!


4
সহজ উত্তর দেওয়ার জন্য ধন্যবাদ
মাইকে

এটির সাথে আমার একমাত্র উচ্চারণ হ'ল আপনাকে অবশ্যই প্রতিটি এনামে এটি প্রয়োগ করতে হবে। কনভেনশনগুলির জন্য এটি তৈরি করা হয়েছিল।
গ্যারি শাটলার

এটি পড়ার জন্য কাজ করে তবে যখন আমি একটি মানদণ্ডের কোয়েরি চেষ্টা করতাম তখন ব্যর্থ হয়েছিল। একটি কনভেনশন স্থাপন (এই প্রশ্নের উত্তর দেখুন) যদিও চেষ্টা করেছি সমস্ত ক্ষেত্রেই কাজ করেছে।
থমাস ব্র্যাট

আমি ভেবেছিলাম এটি দুর্দান্ত ছিল - তবে এটি সমস্যার কারণ হবে: এই পোস্টটি দেখুন। nhforge.org/blogs/nhibernate/archive/2008/10/20/…
upThe ক্রিক

@ ইউপি দ্য ক্রিক দেখে মনে হচ্ছে এটি ঠিক করা হয়েছে এবং এখন এনএইচ দল থেকে জেমস গ্রেগরির দ্বারা এটির প্রস্তাব দেওয়া হয়েছে: মেইল
ইলিয়া কোগান

1

অটোম্যাপিং (এবং সম্ভাব্যভাবে একটি আইওসি ধারক) সহ ফ্লুয়েন্ট এনএইচবারনেট ব্যবহার করার জন্য:

IUserTypeConventionযেমন @ হয় জুলিয়েন উপরে 'র উত্তর: https://stackoverflow.com/a/1706462/878612

public class EnumConvention : IUserTypeConvention
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType.IsEnum);
    }

    public void Apply(IPropertyInstance target)
    {
        target.CustomType(target.Property.PropertyType);
    }
}

ফ্লুয়েন্ট এনএইচবারনেট অটোম্যাপিং কনফিগারেশনটি এভাবে কনফিগার করা যেতে পারে:

    protected virtual ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(SetupDatabase)
            .Mappings(mappingConfiguration =>
                {
                    mappingConfiguration.AutoMappings
                        .Add(CreateAutomappings);
                }
            ).BuildSessionFactory();
    }

    protected virtual IPersistenceConfigurer SetupDatabase()
    {
        return MsSqlConfiguration.MsSql2008.UseOuterJoin()
        .ConnectionString(x => 
             x.FromConnectionStringWithKey("AppDatabase")) // In Web.config
        .ShowSql();
    }

    protected static AutoPersistenceModel CreateAutomappings()
    {
        return AutoMap.AssemblyOf<ClassInAnAssemblyToBeMapped>(
            new EntityAutomapConfiguration())
            .Conventions.Setup(c =>
                {
                    // Other IUserTypeConvention classes here
                    c.Add<EnumConvention>();
                });
    }

* তারপরে CreateSessionFactoryআইওসিতে যেমন ক্যাসেল উইন্ডসর (পার্সেস্টেনসিভিলিটি এবং ইনস্টলার ব্যবহার করে) সহজেই ব্যবহার করা যায়। *

    Kernel.Register(
        Component.For<ISessionFactory>()
            .UsingFactoryMethod(() => CreateSessionFactory()),
            Component.For<ISession>()
            .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession())
            .LifestylePerWebRequest() 
    );

0

আপনি একটি এনএইচবারনেট তৈরি করতে IUserTypeএবং CustomTypeIs<T>()সম্পত্তি মানচিত্রে এটি নির্দিষ্ট করতে পারেন ।


0

আপনার ডিবি সারণীতে আপনার মান / সংক্ষিপ্ত রূপ হিসাবে রাখা উচিত। আপনার এনাম ম্যাপিংয়ের জন্য আপনাকে সঠিকভাবে ম্যাপিং নির্দিষ্ট করতে হবে। দয়া করে নীচে ম্যাপিং এবং এনাম নমুনা দেখুন,

ম্যাপিং ক্লাস

পাবলিক ক্লাসের লেনদেনম্যাপ: ক্লাসম্যাপ লেনদেন
{
    পাবলিক লেনদেনের মানচিত্র ()
    {
        // অন্যান্য ম্যাপিং
        .....
        // এনামের জন্য ম্যাপিং
        মানচিত্র (x => x. স্ট্যাটাস, "স্থিতি") Custom কাস্টম টাইপ ();

        সারণী ("লেনদেন");
    }
}

এনাম

লেনদেন স্ট্যাটাস পাবলিক
{
   অপেক্ষা = 1,
   প্রসেসড = 2,
   রোলডব্যাক = 3,
   অবরুদ্ধ = 4,
   ফেরত = 5,
   ইতিমধ্যে প্রসেসড = 6,
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.