"অবজেক্ট কনটেক্সট উদাহরণটি সমাধান করা হয়েছে এবং কোনও সংযোগের প্রয়োজন হয় এমন ক্রিয়াকলাপগুলির জন্য আর ব্যবহার করা যাবে না" অবৈধ অপশন


122

আমি একটি GridViewব্যবহার সত্তা ফ্রেমওয়ার্ক ব্যবহারের চেষ্টা করছি তবে প্রতিবারই আমি নীচের ত্রুটি পাচ্ছি:

"বস্তু 'COSIS_DAL.MemberLoan' এ সম্পত্তি অ্যাক্সেসর 'Pণপ্রমাণ' নিম্নলিখিত ব্যতিক্রম ছুঁড়ে ফেলেছে: অবজেক্টকন্টেক্সটেক্স দৃষ্টান্তটি নিষ্পত্তি করা হয়েছে এবং কোনও সংযোগের প্রয়োজন হয় এমন ক্রিয়াকলাপগুলির জন্য আর ব্যবহার করা যাবে না।"

আমার কোডটি হ'ল:

public List<MemberLoan> GetAllMembersForLoan(string keyword)
{
    using (CosisEntities db = new CosisEntities())
    {
        IQueryable<MemberLoan> query = db.MemberLoans.OrderByDescending(m => m.LoanDate);
        if (!string.IsNullOrEmpty(keyword))
        {
            keyword = keyword.ToLower();
            query = query.Where(m =>
                  m.LoanProviderCode.Contains(keyword)
                  || m.MemNo.Contains(keyword)
                  || (!string.IsNullOrEmpty(m.LoanProduct.LoanProductName) && m.LoanProduct.LoanProductName.ToLower().Contains(keyword))
                  || m.Membership.MemName.Contains(keyword)
                  || m.GeneralMasterInformation.Description.Contains(keyword)

                  );
        }
        return query.ToList();
    }
}


protected void btnSearch_Click(object sender, ImageClickEventArgs e)
{
    string keyword = txtKeyword.Text.ToLower();
    LoanController c = new LoanController();
    List<COSIS_DAL.MemberLoan> list = new List<COSIS_DAL.MemberLoan>();
    list = c.GetAllMembersForLoan(keyword);

    if (list.Count <= 0)
    {
        lblMsg.Text = "No Records Found";
        GridView1.DataSourceID = null;
        GridView1.DataSource = null;
        GridView1.DataBind();
    }
    else
    {
        lblMsg.Text = "";
        GridView1.DataSourceID = null;   
        GridView1.DataSource = list;
        GridView1.DataBind();
    }
}

ত্রুটিটি এর LoanProductNameকলামটি উল্লেখ করছে Gridview। উল্লেখ করা হয়েছে: আমি সি #, এএসপি নেট, এসকিউএল-সার্ভার ২০০৮ ব্যাক এন্ড ডিবি হিসাবে ব্যবহার করছি।

আমি সত্ত্বা ফ্রেমওয়ার্কে বেশ নতুন। আমি বুঝতে পারি না কেন আমি এই ত্রুটি পাচ্ছি। যে কেউ আমাকে দয়া করে সাহায্য করতে পারেন?


1
আপনি গ্রিডভিউতে কোনও নেভিগেশন বৈশিষ্ট্য অ্যাক্সেস করছেন? যদি আপনি তা করেন তবে আপনার সেই প্রশ্নের মধ্যে ন্যাভিগেশন টেবিলগুলিও অন্তর্ভুক্ত করতে হবে। লাইকquery.Include("SomeOtherTable")
নীলেশ

হয় আপনার সত্তা হোস্ট করার জন্য একটি প্রক্সি ক্লাস তৈরি করার চেষ্টা করুন বা কমপক্ষে একটি বেনামী অবজেক্ট ফিরিয়ে দিন। আমার দৃষ্টিকোণ থেকে, ef ব্যবহার করার জন্য আপনার লজিকগুলি বাস্তবায়নের জন্য প্রক্সি ক্লাস তৈরি করা দরকার, ঠিক যেমন ডিবি অ্যাক্সেস স্তরটি ব্যবসায়ের হিসাবে নয় এডিএমএক্স ব্যবহার করুন।
গনজিক্স

হ্যাঁ গ্রিডভিউতে আমি অন্য একটি টেবিল কলামও পাচ্ছি। যা anণপ্রভাইডার নাম।
বারসান

1
db.MemberLoans.Include("LoanProduct").OrderByDescending()সিনট্যাক্স পরীক্ষা করার চেষ্টা করুন কারণ আমার সামনে ভিএস নেই।
নীলেশ

3
আপনার প্রাসঙ্গিকের বাইরে যে সমস্ত নেভিগেশন বৈশিষ্ট্য অ্যাক্সেস করছেন সেগুলি সহ আপনাকে কেবল চলতে হবে db.MemberLoans.Include("LoanProduct").Include("SomeOtherTable)। @ ট্র্যাজেডিয়ান এবং @ লাজিবেরেজভস্কি দ্বারা উত্তরগুলি দেখুন
নিলেশ

উত্তর:


174

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

public class MemberLoan
{
   public string LoandProviderCode { get; set; }
   public virtual Membership Membership { get; set; }
}

সত্তা ফ্রেমওয়ার্ক এই সত্তা থেকে উত্তরাধিকারসূত্রে প্রাপ্ত প্রক্সি ফিরিয়ে দেবে এবং পরে সদস্যতার অলস লোডিংয়ের অনুমতি দেওয়ার জন্য এই প্রক্সিটিতে DbContext উদাহরণ সরবরাহ করবে:

public class MemberLoanProxy : MemberLoan
{
    private CosisEntities db;
    private int membershipId;
    private Membership membership;

    public override Membership Membership 
    { 
       get 
       {
          if (membership == null)
              membership = db.Memberships.Find(membershipId);
          return membership;
       }
       set { membership = value; }
    }
}

সুতরাং, সত্তার DbContext এর উদাহরণ রয়েছে যা সত্তা লোড করার জন্য ব্যবহৃত হয়েছিল। সেটাই তোমার সমস্যা. usingCosisEntities ব্যবহারের চারপাশে আপনার ব্লক রয়েছে। সত্তা ফেরত দেওয়ার আগে যা প্রসঙ্গ নিষ্পত্তি করে। যখন কিছু কোড পরে অলস-বোঝা নেভিগেশন সম্পত্তি ব্যবহার করার চেষ্টা করে, এটি ব্যর্থ হয়, কারণ সেই মুহূর্তে প্রসঙ্গটি নিষ্পত্তি হয়।

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

IQueryable<MemberLoan> query = db.MemberLoans.Include(m => m.Membership);

এটি সমস্ত সদস্যপদ প্রাক লোড হবে এবং অলস-লোডিং ব্যবহার করা হবে না। বিশদর জন্য এমএসডিএন-তে সম্পর্কিত সংস্থাগুলি লোড হচ্ছে দেখুন ।


আপনার সহায়ক ব্যাখ্যা এবং উত্তরের জন্য অনেক ধন্যবাদ। প্রকৃতপক্ষে এখানে আমি তিনটি টেবিল অন্তর্ভুক্ত করছি যাতে আমি কীভাবে তিনটি টেবিলটি INCLUDE এর সাথে যুক্ত করতে পারি তা জানি না। আপনি দয়া করে এই আমাকে সাহায্য করতে পারেন?
বারসান

8
@ বারসান কেবল একের পর এক সমস্ত নেভিগেশন বৈশিষ্ট্য অন্তর্ভুক্ত করে। উদাহরণস্বরূপ db.MemberLoans.Include(m => m.Membership).Include(m => m.LoanProduct).OrderByDescending(m => m.LoanDate);যা JOIN ক্যোয়ারী উত্পন্ন করবে এবং সমস্ত ডেটা একসাথে ফিরে আসবে।
সের্গেই বেরেজোভস্কিই

1
অনেক অনেক অলস ধন্যবাদ। আমি আপনাকে কৃতজ্ঞ। আপনি আমাকে প্রায় এক দিন বাঁচিয়েছিলেন। আপনার ব্যাখ্যা থেকে আমি সত্তা ফ্রেমওয়ার্ক সম্পর্কে আরও শিখছি। তোমাকে ধন্যবাদ বন্ধু.
বারসান

ধন্যবাদ সাথী, নিখুঁত। আমার একটি ব্যবহারের বিবৃতি ছিল যা অলস লোডিং সীমাবদ্ধ করে। দুর্দান্ত উত্তর।
এনসিবিএল

4
আমি যদি আমার জিজ্ঞাসায় এই সম্পর্কিত সংস্থাগুলি মোটেই অন্তর্ভুক্ত করতে না চাই তবে কী হবে?
অর্টন্ড

32

CosisEntitiesবর্গ আপনার হয় DbContext। আপনি যখন কোনও usingব্লকে একটি প্রসঙ্গ তৈরি করেন , আপনি আপনার ডেটা-ওরিয়েন্টেড ক্রিয়াকলাপের সীমাটি নির্ধারণ করছেন।

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

আপনার দুটি সমস্যা আছে:

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

  2. আপনি আপনার প্রসঙ্গটি অকাল আগেই শেষ করছেন: একটি DbContextকাজ সম্পাদনের পুরো ইউনিট জুড়ে পাওয়া উচিত, যখন আপনি হাতের কাজটি শেষ করেছেন তখনই তা নিষ্পত্তি করে। এএসপি.নেটের ক্ষেত্রে, কাজের এককটি সাধারণত এইচটিটিপি অনুরোধটি পরিচালনা করা হয়।


দরকারী তথ্য এবং সমস্যার সুন্দর ব্যাখ্যা দেওয়ার জন্য আপনাকে অনেক ধন্যবাদ। প্রকৃতপক্ষে আমি সত্তা ফ্রেমওয়ার্কের পাশাপাশি লিন্কেও তাই নতুন তাই এই তথ্যটি আমার পক্ষে শেখার পক্ষে একটি দুর্দান্ত পাঠ।
বারসান

20

শেষের সারি

আপনার কোডটি অলস-লোডিং সক্ষম করার সাথে সত্তা-কাঠামোর মাধ্যমে ডেটা (সত্তা) পুনরুদ্ধার করেছে এবং DbContext নিষ্পত্তি হওয়ার পরে, আপনার কোডটি বৈশিষ্ট্যগুলি (সম্পর্কিত / সম্পর্ক / নেভিগেশন সত্তা) উল্লেখ করছে যা স্পষ্টভাবে অনুরোধ করা হয়নি।

আরো নির্দিষ্টভাবে

InvalidOperationExceptionএই বার্তা থেকে সবসময় একই জিনিস অর্থ: পর DbContext বিন্যস্ত করা হয়েছে আপনি সত্তা-কাঠামোর থেকে তথ্য (সত্ত্বা) অনুরোধ করছেন।

একটি সাধারণ ক্ষেত্রে:

(এই ক্লাসগুলি এই উত্তরের সমস্ত উদাহরণের জন্য ব্যবহৃত হবে এবং ধরে নেবে যে সমস্ত নেভিগেশন বৈশিষ্ট্য সঠিকভাবে কনফিগার করা হয়েছে এবং ডাটাবেসে সংযুক্ত টেবিল রয়েছে)

public class Person
{
  public int Id { get; set; }
  public string name { get; set; }
  public int? PetId { get; set; }
  public Pet Pet { get; set; }
}

public class Pet 
{
  public string name { get; set; }
}

using (var db = new dbContext())
{
  var person = db.Persons.FirstOrDefaultAsync(p => p.id == 1);
}

Console.WriteLine(person.Pet.Name);

শেষ লাইনটি ছুঁড়ে InvalidOperationExceptionফেলবে কারণ dbContext অলস-লোডিং অক্ষম করেনি এবং কোডটি পোষ্য নেভিগেশন সম্পত্তি অ্যাক্সেস করছে কনটেক্সটটি ব্যবহারের মাধ্যমে বিবৃতি নিষ্পত্তি করার পরে।

ডিবাগ

আপনি কীভাবে এই ব্যতিক্রমের উত্স খুঁজে পাবেন? ব্যতিক্রমটি নিজেই দেখার পরিবর্তে, যেখানে এটি ঘটে সেখানে ঠিক ঠিক ফেলে দেওয়া হবে, ভিজ্যুয়াল স্টুডিওতে ডিবাগিংয়ের সাধারণ নিয়মগুলি প্রয়োগ হয়: কৌশলগত ব্রেকপয়েন্টগুলি রাখুন এবং আপনার ভেরিয়েবলগুলি পরীক্ষা করুন , হয় তাদের নামের উপর মাউস রেখে, একটি খোলার ( দ্রুত) উইন্ডোটি দেখুন বা স্থানীয় এবং অটোসের মতো বিভিন্ন ডিবাগিং প্যানেল ব্যবহার করুন।

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

এড়ানো উপায়

অলস-লোডিং অক্ষম করুন

public class MyDbContext : DbContext
{
  public MyDbContext()
  {
    this.Configuration.LazyLoadingEnabled = false;
  }
}

পেশাদাররা: অবৈধ অপশনটি ছুঁড়ে ফেলার পরিবর্তে সম্পত্তিটি শূন্য হবে। নলের বৈশিষ্ট্য অ্যাক্সেস করা বা এই সম্পত্তির বৈশিষ্ট্যগুলিকে পরিবর্তন করার চেষ্টা করা একটি নালরফরেক্সান এক্সসেপশন নিক্ষেপ করবে ।

যখন প্রয়োজন হয় তখন কীভাবে স্পষ্টভাবে অনুরোধ করবেন:

using (var db = new dbContext())
{
  var person = db.Persons
    .Include(p => p.Pet)
    .FirstOrDefaultAsync(p => p.id == 1);
}
Console.WriteLine(person.Pet.Name);  // No Exception Thrown

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

অথবা

using (var db = new dbContext())
{
  var person = db.Persons.FirstOrDefaultAsync(p => p.id == 1);

  var pet = db.Pets.FirstOrDefaultAsync(p => p.id == person.PetId);
}
Console.WriteLine(person.Pet.Name);  // No Exception Thrown

পূর্ববর্তী উদাহরণে, সত্তা ফ্রেমওয়ার্ক ডেটাবেসে অতিরিক্ত কল করে ব্যক্তির পোষা প্রাণিকে স্বাধীনভাবে রূপ দেবে। ডিফল্টরূপে, সত্তা ফ্রেমওয়ার্ক এটি ডাটাবেস থেকে পুনরুদ্ধারকৃত অবজেক্টগুলি ট্র্যাক করে এবং যদি এটি নেভিগেশন বৈশিষ্ট্যগুলির সাথে মেলে যা এটির সাথে মেলে তবে এই সত্তাগুলি স্বয়ংক্রিয়ভাবে যাদুতে তৈরি করবে pop এই ইনস্ট্যান্সের মধ্যে কারণ PetIdউপর Personবস্তু মিলে যায় Pet.Id, সত্তা ফ্রেমওয়ার্ক ধার্য হবে Person.Petথেকে Petউদ্ধার করা মান, আগে মান পোষা পরিবর্তনশীল নির্ধারিত হয়।

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


13

এটি খুব দেরিতে উত্তর কিন্তু আমি অলস লোডিংটি বন্ধ করে বিষয়টি সমাধান করেছি:

db.Configuration.LazyLoadingEnabled = false;

আমার কাছে, স্ট্যাকওভারফ্লো একটি লাইনার নিয়ে আশ্চর্য কাজ করে। এবং এটি আমার জন্য এটি করেছে, আপনাকে কুডোস!
হ্যারল্ড_ফিন্চ

ডাউনসাইডটি আপনাকে ব্যবহার করতে হবে navigation অন্তর্ভুক্ত করুন এবং নেভিগেশন বৈশিষ্ট্যগুলি লোড করতে এর মতো জিনিস।
boylec1986

1

আমার ক্ষেত্রে, আমি সমস্ত মডেলের ব্যবহারকারীদের কলামে পাস করছিলাম এবং এটি সঠিকভাবে ম্যাপ করা হয়নি, সুতরাং আমি কেবল 'ব্যবহারকারীদের নাম' পাস করেছি এবং এটি ঠিক করে দিয়েছে।

var data = db.ApplicationTranceLogs 
             .Include(q=>q.Users)
             .Include(q => q.LookupItems) 
             .Select(q => new { Id = q.Id, FormatDate = q.Date.ToString("yyyy/MM/dd"), ***Users = q.Users,*** ProcessType = q.ProcessType, CoreProcessId = q.CoreProcessId, Data = q.Data }) 
             .ToList();

var data = db.ApplicationTranceLogs 
             .Include(q=>q.Users).Include(q => q.LookupItems) 
             .Select(q => new { Id = q.Id, FormatDate = q.Date.ToString("yyyy/MM/dd"), ***Users = q.Users.Name***, ProcessType = q.ProcessType, CoreProcessId = q.CoreProcessId, Data = q.Data }) 
             .ToList();

1

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

আমার ক্ষেত্রে চাইল্ড অবজেক্টের InventoryItemসংকলন সহ আমার একটি EF অবজেক্ট ছিল InvActivity

class InventoryItem {
...
   // EF code first declaration of a cross table relationship
   public virtual List<InvActivity> ItemsActivity { get; set; }

   public GetLatestActivity()
   {
       return ItemActivity?.OrderByDescending(x => x.DateEntered).SingleOrDefault();
   }
...
}

এবং যেহেতু আমি প্রাসঙ্গিক ক্যোয়ারির পরিবর্তে শিশু অবজেক্ট সংগ্রহ থেকে টানছিলাম (সহ IQueryable), Include()তত্পরতা লোডিং বাস্তবায়নের জন্য ফাংশনটি উপলব্ধ ছিল না। সুতরাং পরিবর্তে আমার সমাধানটি এমন একটি প্রসঙ্গ তৈরি করা ছিল যেখানে থেকে আমি ব্যবহার করেছি GetLatestActivity()এবং attach()ফিরে আসা বস্তুটি:

using (DBContext ctx = new DBContext())
{
    var latestAct = _item.GetLatestActivity();

    // attach the Entity object back to a usable database context
    ctx.InventoryActivity.Attach(latestAct);

    // your code that would make use of the latestAct's lazy loading
    // ie   latestAct.lazyLoadedChild.name = "foo";
}

সুতরাং আপনি উত্সাহী লোড আটকে না।


এটি মূলত আগ্রহী লোডিং, আপনি একটি প্রসঙ্গের মাধ্যমে অবজেক্টটি লোড করেছেন। দুটি মাত্র বিকল্প আছে; উত্সাহী লোডিং এবং অলস লোডিং।
এরিক ফিলিপস

@ এরিক ফিলিপস ঠিক আছে, এটি একটি নতুন ডেটা প্রসঙ্গে
লোজে

1
@ এরিক ফিলিপস - এছাড়াও স্পষ্ট লোড হচ্ছে - ডকস.মাইক্রোসফটকম
ডেভ ব্ল্যাক

1

আপনি যদি এএসপি.নেট কোর ব্যবহার করে থাকেন এবং অবাক হন যে কেন আপনি এই বার্তাটি আপনার কোনও অ্যাসিঙ্ক কন্ট্রোলার পদ্ধতিতে পেয়েছেন তবে নিশ্চিত করুন যে আপনি তার Taskপরিবর্তে voidকোনওটি ফিরে পেয়েছেন - এএসপি.নেট কোর ইনজেকশন প্রসঙ্গটি নিষ্পত্তি করে।

(এই প্রশ্নটি ব্যতিক্রম বার্তায় অনুসন্ধানের ফলাফলগুলিতে উচ্চ হওয়ায় আমি এই উত্তরটি পোস্ট করছি এবং এটি একটি সূক্ষ্ম ইস্যু - এটি গুগল যারা করেন তাদের পক্ষে এটি দরকারী))

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.