শ্রেণীর বৈশিষ্ট্য সহ কলামের নাম ম্যানুয়ালি ম্যাপ করুন


173

আমি ড্যাপার মাইক্রো ওআরএম-তে নতুন। এখনও অবধি আমি সাধারণ ওআরএম সম্পর্কিত স্টাফের জন্য এটি ব্যবহার করতে সক্ষম কিন্তু ক্লাসের বৈশিষ্ট্য সহ আমি ডাটাবেস কলামের নামগুলি ম্যাপ করতে পারছি না।

উদাহরণস্বরূপ, আমার কাছে নিম্নলিখিত ডাটাবেস সারণি রয়েছে:

Table Name: Person
person_id  int
first_name varchar(50)
last_name  varchar(50)

এবং আমার একটি ক্লাস আছে যাকে ব্যক্তি বলে:

public class Person 
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

দয়া করে নোট করুন যে সারণীতে আমার কলামের নামগুলি ক্লাসের সম্পত্তি নামের থেকে পৃথক যা আমি কোয়েরির ফলাফল থেকে প্রাপ্ত ডেটা ম্যাপ করার চেষ্টা করছি।

var sql = @"select top 1 PersonId,FirstName,LastName from Person";
using (var conn = ConnectionFactory.GetConnection())
{
    var person = conn.Query<Person>(sql).ToList();
    return person;
}

উপরের কোডটি কলামের নামগুলি বস্তুর (ব্যক্তি) বৈশিষ্ট্যের সাথে মেলে না বলে কাজ করবে না। এই দৃশ্যে, ড্যাপারে আমি ম্যানুয়ালি ম্যাপ করার জন্য কিছু করতে পারি (যেমন person_id => PersonId) বস্তুর বৈশিষ্ট্য সহ কলামের নামগুলি?


উত্তর:


80

এটি সূক্ষ্মভাবে কাজ করে:

var sql = @"select top 1 person_id PersonId, first_name FirstName, last_name LastName from Person";
using (var conn = ConnectionFactory.GetConnection())
{
    var person = conn.Query<Person>(sql).ToList();
    return person;
}

ড্যাপারের এমন কোনও সুবিধা নেই যা আপনাকে একটি কলাম বৈশিষ্ট্য নির্দিষ্ট করতে দেয় , আমি এর জন্য সমর্থন যোগ করার বিরুদ্ধে নই, এই শর্ত দিয়ে যে আমরা নির্ভরতা না টান।


@ স্যাম জাফরান এখানে কোনও উপায় নেই যা আমি টেবিলের ওরফে নির্দিষ্ট করতে পারি। দেশ নামে আমার একটি ক্লাস রয়েছে তবে ডিবিতে সংরক্ষণাগার নামকরণের কনভেনশনের কারণে টেবিলটির খুব মিলিত নাম রয়েছে has
TheVilageIdiot

64
সঞ্চিত পদ্ধতির ফলাফল ম্যাপিংয়ের জন্য কলামের বৈশিষ্ট্য কার্যকর হবে।
রনি ওভারবি

2
কলাম বৈশিষ্ট্যগুলি আরও সহজেই আপনার ডোমেন এবং আপনার সত্তাগুলি বাস্তবায়নের জন্য ব্যবহার করছেন এমন সরঞ্জাম প্রয়োগের বিশদগুলির মধ্যে শক্ত শারীরিক এবং / অথবা অর্থসূচক সংযোগের সুবিধার্থে দরকারী। অতএব, এই জন্য সমর্থন যোগ করবেন না !!!! :)
ডেরেক গ্রেয়ার

টেবিলব্যাট্রিবিউট করার সময় কেন কলামাট্রিব সেখানে নেই তা আমি পাই না। এই উদাহরণটি কীভাবে সন্নিবেশ, আপডেট এবং এসপিগুলির সাথে কাজ করবে? আমি কলামাট্রিবি দেখতে চাই, এটির মৃত সহজ এবং জীবনকে খুব সহজেই অন্য সমাধানগুলি থেকে সরিয়ে নেওয়া সহজতর করে তুলবে যা এখনকার অবসন্ন লিনক-এসকিএলের অনুরূপ কিছু বাস্তবায়ন করে।
ভিমান

197

ড্যাপার এখন সম্পত্তি ম্যাপারগুলিতে কাস্টম কলাম সমর্থন করে। এটি ITypeMap ইন্টারফেসের মাধ্যমে তা করে । একজন CustomPropertyTypeMap বর্গ ড্যাপার যে এই কাজের সবচেয়ে কি করতে পারেন দ্বারা প্রদান করা হয়। উদাহরণ স্বরূপ:

Dapper.SqlMapper.SetTypeMap(
    typeof(TModel),
    new CustomPropertyTypeMap(
        typeof(TModel),
        (type, columnName) =>
            type.GetProperties().FirstOrDefault(prop =>
                prop.GetCustomAttributes(false)
                    .OfType<ColumnAttribute>()
                    .Any(attr => attr.Name == columnName))));

এবং মডেল:

public class TModel {
    [Column(Name="my_property")]
    public int MyProperty { get; set; }
}

এটি লক্ষণীয় গুরুত্বপূর্ণ যে কাস্টমপ্রপার্টিটাইপম্যাপের প্রয়োগের জন্য অ্যাট্রিবিউটটি থাকা দরকার এবং কলামের নামের কোনওটির সাথে মেলানো হবে বা সম্পত্তিটি ম্যাপ করা হবে না। DefaultTypeMap বর্গ মান কার্যকারিতা উপলব্ধ করা হয় এবং এই আচরণ পরিবর্তন করার জন্য leveraged করা যেতে পারে:

public class FallbackTypeMapper : SqlMapper.ITypeMap
{
    private readonly IEnumerable<SqlMapper.ITypeMap> _mappers;

    public FallbackTypeMapper(IEnumerable<SqlMapper.ITypeMap> mappers)
    {
        _mappers = mappers;
    }

    public SqlMapper.IMemberMap GetMember(string columnName)
    {
        foreach (var mapper in _mappers)
        {
            try
            {
                var result = mapper.GetMember(columnName);
                if (result != null)
                {
                    return result;
                }
            }
            catch (NotImplementedException nix)
            {
            // the CustomPropertyTypeMap only supports a no-args
            // constructor and throws a not implemented exception.
            // to work around that, catch and ignore.
            }
        }
        return null;
    }
    // implement other interface methods similarly

    // required sometime after version 1.13 of dapper
    public ConstructorInfo FindExplicitConstructor()
    {
        return _mappers
            .Select(mapper => mapper.FindExplicitConstructor())
            .FirstOrDefault(result => result != null);
    }
}

এবং সেই জায়গায় এটির সাথে এটি একটি কাস্টম টাইপ ম্যাপার তৈরি করা সহজ হয়ে যায় যা বৈশিষ্ট্যগুলি উপস্থিত থাকলে তা স্বয়ংক্রিয়ভাবে ব্যবহার করবে তবে অন্যথায় স্ট্যান্ডার্ড আচরণে ফিরে আসবে:

public class ColumnAttributeTypeMapper<T> : FallbackTypeMapper
{
    public ColumnAttributeTypeMapper()
        : base(new SqlMapper.ITypeMap[]
            {
                new CustomPropertyTypeMap(
                   typeof(T),
                   (type, columnName) =>
                       type.GetProperties().FirstOrDefault(prop =>
                           prop.GetCustomAttributes(false)
                               .OfType<ColumnAttribute>()
                               .Any(attr => attr.Name == columnName)
                           )
                   ),
                new DefaultTypeMap(typeof(T))
            })
    {
    }
}

এর অর্থ আমরা এখন সহজেই এমন ধরণের সমর্থন করতে পারি যেগুলি বৈশিষ্ট্যগুলি ব্যবহার করে মানচিত্রের প্রয়োজন হয়:

Dapper.SqlMapper.SetTypeMap(
    typeof(MyModel),
    new ColumnAttributeTypeMapper<MyModel>());

সম্পূর্ণ উত্স কোডের এখানে একটি গিস্ট


আমি এই একই সমস্যার সাথে লড়াই করে যাচ্ছি ... এবং এটি আমার যে পথে চলতে হবে তার মতো মনে হচ্ছে ... এই কোডটি "ডাপার.সক্ল্যাম্পার.সেটটাইপম্যাপ (টাইপফ (মাইমোডেল)) নামে পরিচিত হবে সে সম্পর্কে আমি বেশ বিভ্রান্ত নতুন কলামআট্রিবিউটটাইপম্যাপার <মাইমোডেল> ()); " stackoverflow.com/questions/14814972/…
রোহান বচনার

কোনও প্রশ্ন করার আগে আপনি একবার কল করতে চাইবেন। আপনি এটি একটি স্ট্যাটিক কনস্ট্রাক্টারে করতে পারেন, উদাহরণস্বরূপ, এটি কেবল একবার কল করা প্রয়োজন।
কালেব পেডারসন

7
এটি অফিশিয়াল উত্তর করার পরামর্শ দিন - ডাপারের এই বৈশিষ্ট্যটি অত্যন্ত কার্যকর।
কিলথ্রুশ

3
ম্যাপিং সমাধান @Oliver (পোস্ট করেছে stackoverflow.com/a/34856158/364568 ) কাজ করে এবং কম কোড প্রয়োজন।
রিগা

4
আমি পছন্দ করি কীভাবে "সহজেই" শব্দটি এত সহজেই অনায়াসে ছড়িয়ে দেওয়া হয়: পি
জোনাথন বি।

80

কিছু সময়ের জন্য, নিম্নলিখিতগুলির কাজ করা উচিত:

Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;

6
যদিও এটি " শ্রেণীর বৈশিষ্ট্যযুক্ত ম্যানুয়ালি কলামের নামগুলি মানচিত্রের প্রশ্নের" প্রশ্নের উত্তর নয় তবে আমার পক্ষে ম্যানুয়ালি মানচিত্র করা থেকে অনেক ভাল (দুর্ভাগ্যক্রমে পোস্টগ্রিসকিউএলএ কলামের নামগুলিতে আন্ডারস্কোর ব্যবহার করা ভাল)। পরবর্তী সংস্করণগুলিতে MatchNamesWithUnderscores বিকল্পটি সরান না দয়া করে! ধন্যবাদ!!!
ভিক্টোভার্টন

5
@ উইক্টোরভার্টন MatchNamesWithUnderscoresবিকল্প অপসারণ করার কোন পরিকল্পনা নেই । সেরা এ , যদি আমরা কনফিগারেশন API রি-ফ্যাক্টর, আমি ছেড়ে দিতেন MatchNamesWithUnderscoresজায়গায় সদস্য (এখনও কাজ করে, আদর্শভাবে) এবং একটি অ্যাড [Obsolete]নতুন API বিন্দু লোকদের চিহ্নিতকারী।
মার্ক গ্র্যাভেল

4
@ মার্কগ্রাভেল আপনার উত্তরটির শুরুতে "কিছু সময়ের জন্য" শব্দটি আমাকে উদ্বিগ্ন করে তুলেছিল যে আপনি এটি ভবিষ্যতের সংস্করণে সরিয়ে ফেলতে পারেন, স্পষ্ট করার জন্য ধন্যবাদ! এবং ড্যাপারের জন্য একটি আপনাকে ধন্যবাদ, একটি দুর্দান্ত মাইক্রো ওআরএম যা আমি সবেমাত্র এএসপি.নেট কোর-এ এনপিগ্সকিএল সহ একটি ক্ষুদ্র প্রকল্পের জন্য ব্যবহার শুরু করেছি!
ভিক্টোভার্টন

2
এটি সহজেই সেরা উত্তর। আমি চারপাশে কাজের পাইলস এবং স্তূপ খুঁজে পেয়েছি, তবে শেষ পর্যন্ত এটি হোঁচট খেয়েছে। সহজেই সেরা তবে স্বল্প বিজ্ঞাপনে দেওয়া উত্তর।
চা মনিফ্রুট

29

এখানে একটি সহজ সমাধান যা আপনাকে আপনার POCOs এর বাইরে অবকাঠামো কোড রাখতে দেয় এমন বৈশিষ্ট্যের প্রয়োজন হয় না।

ম্যাপিংগুলি মোকাবেলা করার জন্য এটি একটি শ্রেণি। আপনি যদি সমস্ত কলামগুলি ম্যাপ করে থাকেন তবে একটি অভিধান কাজ করবে তবে এই শ্রেণিটি আপনাকে কেবলমাত্র পার্থক্য নির্দিষ্ট করতে দেয়। এছাড়াও, এতে বিপরীত মানচিত্র অন্তর্ভুক্ত রয়েছে যাতে আপনি কলাম থেকে ক্ষেত্রটি এবং ক্ষেত্র থেকে কলামটি পেতে পারেন, যা এসকিউএল বিবৃতি উত্পন্ন করার মতো জিনিসগুলি করার সময় কার্যকর হতে পারে।

public class ColumnMap
{
    private readonly Dictionary<string, string> forward = new Dictionary<string, string>();
    private readonly Dictionary<string, string> reverse = new Dictionary<string, string>();

    public void Add(string t1, string t2)
    {
        forward.Add(t1, t2);
        reverse.Add(t2, t1);
    }

    public string this[string index]
    {
        get
        {
            // Check for a custom column map.
            if (forward.ContainsKey(index))
                return forward[index];
            if (reverse.ContainsKey(index))
                return reverse[index];

            // If no custom mapping exists, return the value passed in.
            return index;
        }
    }
}

কলামম্যাপ অবজেক্টটি সেটআপ করুন এবং ড্যাপারকে ম্যাপিংটি ব্যবহার করতে বলুন।

var columnMap = new ColumnMap();
columnMap.Add("Field1", "Column1");
columnMap.Add("Field2", "Column2");
columnMap.Add("Field3", "Column3");

SqlMapper.SetTypeMap(typeof (MyClass), new CustomPropertyTypeMap(typeof (MyClass), (type, columnName) => type.GetProperty(columnMap[columnName])));

আপনার পোকোতে মূলত আপনার ডাটাবেসটি কী থেকে ফিরে আসছে, উদাহরণস্বরূপ, একটি সঞ্চিত পদ্ধতিতে যখন আপনার মেইলগুলির মিল নেই তবে এটি একটি ভাল সমাধান।
ক্রাশ করুন

1
আমি সংক্ষেপে পছন্দ করি যে কোনও অ্যাট্রিবিউট ব্যবহার করে তা দেয় তবে ধারণাটি এই পদ্ধতিটি আরও পরিষ্কার - এটি আপনার পোকোকে ডেটাবেসের বিবরণে জুড়ে দেয় না।
ব্রুনো ব্র্যান্ট

যদি আমি ড্যাপারটি সঠিকভাবে বুঝতে পারি তবে এটির একটি নির্দিষ্ট সন্নিবেশ () পদ্ধতি নেই, কেবল একটি এক্সিকিউট () ... এই ম্যাপিং পদ্ধতির সন্নিবেশের জন্য কাজ করবে? নাকি আপডেটস? ধন্যবাদ
UuDdLrLrSs

29

আমি ডায়নামিক এবং লিনকিউ ব্যবহার করে নিম্নলিখিতটি করি:

    var sql = @"select top 1 person_id, first_name, last_name from Person";
    using (var conn = ConnectionFactory.GetConnection())
    {
        List<Person> person = conn.Query<dynamic>(sql)
                                  .Select(item => new Person()
                                  {
                                      PersonId = item.person_id,
                                      FirstName = item.first_name,
                                      LastName = item.last_name
                                  }
                                  .ToList();

        return person;
    }

12

এটি অর্জনের একটি সহজ উপায় হ'ল আপনার ক্যোয়ারীর কলামগুলিতে কেবলমাত্র এলিয়াস ব্যবহার করা। যদি আপনার ডাটাবেস কলামটি হয় PERSON_IDএবং আপনার অবজেক্টের স্বত্ব হয় IDআপনি কেবল select PERSON_ID as Id ...আপনার ক্যোয়ারিতে করতে পারেন এবং ড্যাপার এটি প্রত্যাশা অনুযায়ী বেছে নেবেন।


12

ড্যাপার টেস্ট থেকে নেওয়া যা বর্তমানে ডিপার 1.42 এ রয়েছে on

// custom mapping
var map = new CustomPropertyTypeMap(typeof(TypeWithMapping), 
                                    (type, columnName) => type.GetProperties().FirstOrDefault(prop => GetDescriptionFromAttribute(prop) == columnName));
Dapper.SqlMapper.SetTypeMap(typeof(TypeWithMapping), map);

বিবরণ বৈশিষ্ট্যটির নাম পেতে সহায়তা সহায়ক শ্রেণি (আমি ব্যক্তিগতভাবে কলামটি @ ক্যালবসের উদাহরণ হিসাবে ব্যবহার করেছি)

static string GetDescriptionFromAttribute(MemberInfo member)
{
   if (member == null) return null;

   var attrib = (DescriptionAttribute)Attribute.GetCustomAttribute(member, typeof(DescriptionAttribute), false);
   return attrib == null ? null : attrib.Description;
}

শ্রেণী

public class TypeWithMapping
{
   [Description("B")]
   public string A { get; set; }

   [Description("A")]
   public string B { get; set; }
}

1
অর্ডার যেখানে কোন বিবরণ সংজ্ঞায়িত করা হয় এটা বৈশিষ্ট্যের জন্য এমনকি কাজ করার জন্য, আমি ফেরত পরিবর্তন GetDescriptionFromAttributeকরতে return (attrib?.Description ?? member.Name).ToLower();যোগ .ToLower()করার columnNameমানচিত্র এটা কেস সংবেদনশীল হওয়া উচিত নয়।
স্যাম হোয়াইট

11

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

var sql = @"select top 1 person_id as PersonId,FirstName,LastName from Person";

8

আপনি আপনার ডাটাবেসে সংযোগটি খোলার আগে, আপনার প্রতিটি পোকো ক্লাসের জন্য এই কোডের টুকরোটি কার্যকর করুন:

// Section
SqlMapper.SetTypeMap(typeof(Section), new CustomPropertyTypeMap(
    typeof(Section), (type, columnName) => type.GetProperties().FirstOrDefault(prop =>
    prop.GetCustomAttributes(false).OfType<ColumnAttribute>().Any(attr => attr.Name == columnName))));

তারপরে আপনার পোকো ক্লাসে ডেটা টীকা যুক্ত করুন:

public class Section
{
    [Column("db_column_name1")] // Side note: if you create aliases, then they would match this.
    public int Id { get; set; }
    [Column("db_column_name2")]
    public string Title { get; set; }
}

এর পরে, আপনি সব প্রস্তুত। কেবল একটি কোয়েরি কল করুন, এরকম কিছু:

using (var sqlConnection = new SqlConnection("your_connection_string"))
{
    var sqlStatement = "SELECT " +
                "db_column_name1, " +
                "db_column_name2 " +
                "FROM your_table";

    return sqlConnection.Query<Section>(sqlStatement).AsList();
}

1
কলামের বৈশিষ্ট্য থাকতে এটির সমস্ত বৈশিষ্ট্যের প্রয়োজন। ম্যাপার উপলভ্য না থাকলে সম্পত্তি সহ মানচিত্রের কোনও উপায় আছে কি?
সন্দীপ.gosavi

5

আপনি যদি .NET 4.5.1 বা ততোধিক চেকআউট ড্যাপার ব্যবহার করছেন। এটি আপনাকে আপনার মডেল থেকে সম্পূর্ণরূপে ডিবি ম্যাপিংকে পৃথক করতে দেয় (টীকাগুলির প্রয়োজন নেই)


5
আমি ড্যাপার.ফ্লিয়েন্টকলামম্যাপিংয়ের লেখক। মডেলগুলি থেকে ম্যাপিংগুলি আলাদা করা প্রাথমিক নকশার অন্যতম লক্ষ্য ছিল। আমি উদ্বেগের পরিষ্কার বিচ্ছিন্নতার জন্য ডাটাবেস-নির্দিষ্ট কংক্রিট বাস্তবায়নগুলি থেকে মূল ডেটা অ্যাক্সেস (অর্থাত্‍ রেপোজিটরি ইন্টারফেস, মডেল অবজেক্টস ইত্যাদি) বিচ্ছিন্ন হতে চাই wanted উল্লেখ করার জন্য ধন্যবাদ এবং আমি আপনাকে এটি দরকারী বলে খুশী করেছি! :-)
আলেকজান্ডার

github.com/henkmollema/Dapper-FluentMap একই রকম। তবে আপনার আর তৃতীয় পক্ষের প্যাকেজ দরকার নেই। Dapper Dapper.SqlMapper যুক্ত করেছে। আপনি যদি আগ্রহী হন তবে আরও তথ্যের জন্য আমার উত্তরটি দেখুন।
তাদেজ

4

এটি পিগি অন্যান্য উত্তরগুলির পিছনে ব্যাক করছে। ক্যোরি স্ট্রিং পরিচালনা করার জন্য এটি আমার কেবল একটি চিন্তা।

Person.cs

public class Person 
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public static string Select() 
    {
        return $"select top 1 person_id {nameof(PersonId)}, first_name {nameof(FirstName)}, last_name {nameof(LastName)}from Person";
    }
}

এপিআই পদ্ধতি

using (var conn = ConnectionFactory.GetConnection())
{
    var person = conn.Query<Person>(Person.Select()).ToList();
    return person;
}

1

আপনারা যারা Dapper 1.12 ব্যবহার করেন তাদের জন্য, এটি সম্পন্ন করার জন্য আপনার যা করা উচিত তা এখানে:

  • একটি নতুন কলাম বৈশিষ্ট্য শ্রেণি যুক্ত করুন:

      [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property]
    
      public class ColumnAttribute : Attribute
      {
    
        public string Name { get; set; }
    
        public ColumnAttribute(string name)
        {
          this.Name = name;
        }
      }

  • এই লাইনের জন্য অনুসন্ধান করুন:

    map = new DefaultTypeMap(type);

    এবং এটি মন্তব্য।

  • পরিবর্তে এটি লিখুন:

            map = new CustomPropertyTypeMap(type, (t, columnName) =>
            {
              PropertyInfo pi = t.GetProperties().FirstOrDefault(prop =>
                                prop.GetCustomAttributes(false)
                                    .OfType<ColumnAttribute>()
                                    .Any(attr => attr.Name == columnName));
    
              return pi != null ? pi : t.GetProperties().FirstOrDefault(prop => prop.Name == columnName);
            });


  • আমি নিশ্চিত যে আমি বুঝতে পেরেছি না - আপনি কি সুপারিশ করছেন যে ব্যবহারকারীরা কলামগুলি দিয়ে অ্যাট্রিবিউট ম্যাপিংয়ের জন্য ডাপার পরিবর্তন করবেন? যদি তা হয় তবে ড্যাপারে কোনও পরিবর্তন না করেই আমি উপরে পোস্ট করা কোডটি ব্যবহার করা সম্ভব।
    কালেব পেডারসন

    1
    তবে তারপরে আপনাকে প্রতিটি মডেল টাইপের জন্য ম্যাপিং ফাংশনটি কল করতে হবে ?? আমি একটি জেনেরিক সমাধানে আগ্রহী যাতে আমার সমস্ত প্রকারের প্রতিটি ধরণের জন্য ম্যাপিংকে কল না করেই বৈশিষ্ট্যটি ব্যবহার করতে পারে।
    উরি আব্রামসন

    2
    আমি দেখতে চাই ডিফল্টটাইপম্যাপটি কৌশলগত প্যাটার্ন ব্যবহার করে এটি প্রয়োগ করা হবে যেমন @ ইউরিআব্র্যামসন উল্লেখ করেছেন সেই কারণে এটি প্রতিস্থাপন করা যেতে পারে। কোড. google.com/p/dapper-dot-net/issues/detail?id=140
    রিচার্ড

    1

    কালেব পেডারসনের সমাধানটি আমার পক্ষে কাজ করেছিল। আমি একটি কাস্টম অ্যাট্রিবিউট (একই ডোমেন অবজেক্টে দুটি পৃথক ম্যাপিংয়ের প্রয়োজন ছিল) এবং ক্ষেত্রের যে ক্ষেত্রটি সংগ্রহ করা দরকার এবং প্রকারভেদগুলি পৃথক হয় সে ক্ষেত্রে প্রাইভেট সেটারগুলিকে মঞ্জুরি দেওয়ার জন্য কলাম অ্যাট্রিবিউটটাইপম্যাপার আপডেট করেছি properties

    public class ColumnAttributeTypeMapper<T,A> : FallbackTypeMapper where A : ColumnAttribute
    {
        public ColumnAttributeTypeMapper()
            : base(new SqlMapper.ITypeMap[]
                {
                    new CustomPropertyTypeMap(
                       typeof(T),
                       (type, columnName) =>
                           type.GetProperties( BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).FirstOrDefault(prop =>
                               prop.GetCustomAttributes(true)
                                   .OfType<A>()
                                   .Any(attr => attr.Name == columnName)
                               )
                       ),
                    new DefaultTypeMap(typeof(T))
                })
        {
            //
        }
    }

    1

    আমি জানি এটি তুলনামূলকভাবে পুরানো থ্রেড, তবে আমি ভেবেছিলাম যে আমি যা করেছি সেখানে ফেলে দেব।

    আমি বিশ্বব্যাপী অ্যাট্রিবিউট-ম্যাপিংয়ের কাজ করতে চেয়েছিলাম। হয় আপনি সম্পত্তির নামের সাথে মিলিত হন (ওরফে ডিফল্ট) অথবা আপনি শ্রেণীর সম্পত্তিতে একটি কলাম বৈশিষ্ট্যের সাথে মেলে। আমি যে প্রতি ক্লাসে ম্যাপিং করছি তার জন্য এটি সেট আপ করতে চাইনি। এর মতো, আমি একটি ড্যাপারস্টার্ট ক্লাস তৈরি করেছি যা আমি অ্যাপ্লিকেশন শুরু করার জন্য প্রার্থনা করছি:

    public static class DapperStart
    {
        public static void Bootstrap()
        {
            Dapper.SqlMapper.TypeMapProvider = type =>
            {
                return new CustomPropertyTypeMap(typeof(CreateChatRequestResponse),
                    (t, columnName) => t.GetProperties().FirstOrDefault(prop =>
                        {
                            return prop.Name == columnName || prop.GetCustomAttributes(false).OfType<ColumnAttribute>()
                                       .Any(attr => attr.Name == columnName);
                        }
                    ));
            };
        }
    }

    বেশ সহজ. আমি ঠিক এটি লেখার সাথে সাথে আমি কী কী সমস্যা নিয়ে কাজ করব তা নিশ্চিত নয় তবে এটি কার্যকর works


    ক্রিয়েটচ্যাটআরকুয়েস্টরেস্পোনস দেখতে কেমন? এছাড়াও, আপনি কীভাবে এটি প্রারম্ভকালে ডাকছেন?
    গ্লেন এফ।

    1
    @GlenF। মুল বক্তব্যটি হ'ল ক্রিয়েটচ্যাটআরকুয়েস্টরেস্পোনস কী দেখায় তা বিবেচ্য নয়। এটি যে কোনও পোকো হতে পারে। এটি আপনার প্রারম্ভিকালে আমন্ত্রণ জানায়। আপনি এটিকে কেবল আপনার স্টার্টআপস বা আপনার Global.asax এ আপনার অ্যাপ্লিকেশন শুরু করতে পারেন।
    ম্যাট এম

    সম্ভবত আমি পুরোপুরি ভুল, কিন্তু যদি না CreateChatRequestResponseপ্রতিস্থাপন করা হয় তবে Tকীভাবে এটি সমস্ত সত্তা অবজেক্টগুলির মাধ্যমে পুনরাবৃত্তি হবে। আমি ভুল হলে আমাকে সংশোধন করুন।
    Fwd079

    0

    কালেব যে সমস্যার সমাধান করার চেষ্টা করছেন তার সহজ সমাধানটি হ'ল কলামের বৈশিষ্ট্যটি উপস্থিত না থাকলে কেবলমাত্র সম্পত্তি নাম গ্রহণ করা:

    Dapper.SqlMapper.SetTypeMap(
        typeof(T),
        new Dapper.CustomPropertyTypeMap(
            typeof(T),
            (type, columnName) =>
                type.GetProperties().FirstOrDefault(prop =>
                    prop.GetCustomAttributes(false)
                        .OfType<ColumnAttribute>()
                        .Any(attr => attr.Name == columnName) || prop.Name == columnName)));
    
    আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
    Licensed under cc by-sa 3.0 with attribution required.