সম্পর্কটি পরিবর্তন করা যায়নি কারণ এক বা একাধিক বিদেশী-মূল বৈশিষ্ট্য অযোগ্য n


192

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

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

আমি এই লাইনটি বেশ বুঝতে পারি না:

সম্পর্কটি পরিবর্তন করা যায়নি কারণ এক বা একাধিক বিদেশী-মূল বৈশিষ্ট্য অযোগ্য n

আমি কেন 2 সত্তার মধ্যে সম্পর্ক পরিবর্তন করব? পুরো অ্যাপ্লিকেশনটির আজীবন এটি একই থাকবে remain

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

কোডের লাইনগুলিকে এটিকে নিস্তৃত করা যেতে পারে:

var thisParent = _repo.GetById(1);
thisParent.ChildItems = modifiedParent.ChildItems();
_repo.Save();

আমি নীচের নিবন্ধে সমাধান # 2 ব্যবহার করে আমার উত্তর ক্রয়ের সন্ধান পেয়েছি, মূলত আমি পিতামাতার সারণির রেফারেন্সের জন্য শিশু টেবিলে একটি প্রাথমিক কী যুক্ত করেছি (সুতরাং এটিতে দুটি প্রাথমিক কী রয়েছে (প্যারেন্ট টেবিলের জন্য বিদেশী কী এবং আইডি চাইল্ড টেবিলের জন্য)। c-sharpcorner.com/UploadFile/ff2f08/…
yougotiger

@jaffa, আমি দেখেছি আমার উত্তর এখানে stackoverflow.com/questions/22858491/...
আন্তোনিও

উত্তর:


159

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

সম্পাদন করা

শিশু আইটেমগুলি যুক্ত করা, আপডেট করা এবং মুছতে পারলে আমি কী করব:

public void UpdateEntity(ParentItem parent)
{
    // Load original parent including the child item collection
    var originalParent = _dbContext.ParentItems
        .Where(p => p.ID == parent.ID)
        .Include(p => p.ChildItems)
        .SingleOrDefault();
    // We assume that the parent is still in the DB and don't check for null

    // Update scalar properties of parent,
    // can be omitted if we don't expect changes of the scalar properties
    var parentEntry = _dbContext.Entry(originalParent);
    parentEntry.CurrentValues.SetValues(parent);

    foreach (var childItem in parent.ChildItems)
    {
        var originalChildItem = originalParent.ChildItems
            .Where(c => c.ID == childItem.ID && c.ID != 0)
            .SingleOrDefault();
        // Is original child item with same ID in DB?
        if (originalChildItem != null)
        {
            // Yes -> Update scalar properties of child item
            var childEntry = _dbContext.Entry(originalChildItem);
            childEntry.CurrentValues.SetValues(childItem);
        }
        else
        {
            // No -> It's a new child item -> Insert
            childItem.ID = 0;
            originalParent.ChildItems.Add(childItem);
        }
    }

    // Don't consider the child items we have just added above.
    // (We need to make a copy of the list by using .ToList() because
    // _dbContext.ChildItems.Remove in this loop does not only delete
    // from the context but also from the child collection. Without making
    // the copy we would modify the collection we are just interating
    // through - which is forbidden and would lead to an exception.)
    foreach (var originalChildItem in
                 originalParent.ChildItems.Where(c => c.ID != 0).ToList())
    {
        // Are there child items in the DB which are NOT in the
        // new child item collection anymore?
        if (!parent.ChildItems.Any(c => c.ID == originalChildItem.ID))
            // Yes -> It's a deleted child item -> Delete
            _dbContext.ChildItems.Remove(originalChildItem);
    }

    _dbContext.SaveChanges();
}

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

আমি জানি না যে এটি একটি ভাল সমাধান কিনা, তবে আমি বিশ্বাস করি যে নেভিগেশন সংগ্রহের সমস্ত ধরণের পরিবর্তনগুলি যত্ন নেওয়ার জন্য এই লাইনগুলির সাথে এক ধরণের কঠোর পরিশ্রম করতে হবে। এটি করার সহজ উপায়টি দেখে আমিও খুশি হব।


সুতরাং কিছু যদি শুধুমাত্র পরিবর্তন করা হয়? তার মানে কি আমি এখনও তাদের মুছে ফেলা এবং আবার যুক্ত করতে হবে?
জাফা 17

@ জন: না, আপনি অবশ্যই বিদ্যমান আইটেমগুলি আপডেট করতে পারেন। আমি কীভাবে সম্ভবত শিশু সংগ্রহ আপডেট করব, একটি উদাহরণ যুক্ত করেছি, উপরের সম্পাদনা বিভাগটি দেখুন।
স্লুমা

@ স্লুমা: লল, যদি আমি জানতাম যে আপনি নিজের উত্তরটি পরিবর্তন করতে চলেছেন তবে আমি আমার উত্তর লিখব না ...
লাদিস্লাভ মির্নকা

@ লাডিস্লাভ: না, না, আপনি নিজের উত্তর লিখেছেন বলে আমি আনন্দিত। এখন কমপক্ষে আমি জানি যে এটি সম্পূর্ণ বাজে কথা নয় এবং উপরে আমি যা করেছি তা খুব জটিল।
স্লুমা

1
পূর্বাংশে আসল চিঠিটিমটি পুনরুদ্ধার করার সময় আমি একটি শর্ত যুক্ত করব: ... যেখানে (সি => সি.আইডি == চাইল্ড আইটেম.আইডি && সি.আইডি! = 0) অন্যথায় চাইল্ড আইটেম.আইডি যদি নতুন যুক্ত হওয়া বাচ্চাদের ফিরিয়ে দেয় == 0.
নিখুঁত_এলিমেন্ট

116

যে কারণে আপনি এর মুখোমুখি হচ্ছেন তা হ'ল সংমিশ্রণ এবং সমষ্টিগুলির মধ্যে পার্থক্য ।

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

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

সত্তা ফ্রেমওয়ার্ক যেভাবে একত্রিকরণ এবং রচনা সম্পর্ককে আলাদা করে তা নিম্নরূপ:

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

  • সংহতকরণের জন্য: এটি আশা করে যে শিশুটির বিদেশী মূল সম্পত্তিটি অযোগ্য হবে।

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

সলিউশন:

1- আপনার যদি কোনও যৌগিক কী ব্যবহার না করার দৃ strong় কারণ থাকে তবে আপনার বাচ্চাদের জিনিসগুলি স্পষ্টভাবে মুছে ফেলতে হবে। এবং এটি পূর্বে প্রস্তাবিত সমাধানগুলির চেয়ে সহজতর করা যেতে পারে:

context.Children.RemoveRange(parent.Children);

2- অন্যথায়, আপনার সন্তানের টেবিলে সঠিক প্রাথমিক কীটি সেট করে আপনার কোডটি আরও অর্থবহ দেখাচ্ছে:

parent.Children.Clear();

9
আমি এই ব্যাখ্যাটি সবচেয়ে সহায়ক বলে মনে করেছি।
বুজি বয়

7
সংমিশ্রণ বনাম সমষ্টি এবং সত্তা কাঠামো এর সাথে কীভাবে সম্পর্কিত তার জন্য ভাল ব্যাখ্যা।
ক্রিসালিস

# 1 সমস্যা সমাধানের জন্য প্রয়োজনীয় কোডের ন্যূনতম পরিমাণ ছিল। ধন্যবাদ!
রায়ানুলিট

73

এটি একটি খুব বড় সমস্যা। আপনার কোডে আসলে যা ঘটে তা হ'ল:

  • আপনি Parentডাটাবেস থেকে লোড করুন এবং একটি সংযুক্ত সত্তা পান
  • আপনি এর শিশু সংগ্রহকে বিচ্ছিন্ন শিশুদের নতুন সংগ্রহের সাথে প্রতিস্থাপন করুন
  • আপনি পরিবর্তনগুলি সংরক্ষণ করেন কিন্তু এই অপারেশন চলাকালীন সমস্ত বাচ্চাদের যুক্ত হিসাবে বিবেচনা করা হয় কারণ EF তাদের এখনও অবধি জানেনি। সুতরাং EF প্রবীণ বাচ্চাদের বিদেশী কীটি বাতিল করতে এবং সমস্ত নতুন বাচ্চাদের => নকল সারি sertোকানোর চেষ্টা করে।

এখন সমাধানটি আপনি কী করতে চান তার উপর নির্ভর করে এবং আপনি এটি কীভাবে করতে চান?

আপনি যদি এএসপি.নেট এমভিসি ব্যবহার করেন তবে আপনি আপডেটমোডেল বা ট্রাইআপডেটমোডেল ব্যবহারের চেষ্টা করতে পারেন ।

আপনি যদি কেবল বিদ্যমান শিশুদের ম্যানুয়ালি আপডেট করতে চান তবে আপনি সহজভাবে কিছু করতে পারেন:

foreach (var child in modifiedParent.ChildItems)
{
    context.Childs.Attach(child); 
    context.Entry(child).State = EntityState.Modified;
}

context.SaveChanges();

Modifiedসংযুক্তি আসলে প্রয়োজন হয় না (রাষ্ট্রটি সেট করেও সত্তাকে সংযুক্ত করা হবে) তবে আমি এটি পছন্দ করি কারণ এটি প্রক্রিয়াটিকে আরও সুস্পষ্ট করে তোলে।

আপনি যদি বিদ্যমানটি সংশোধন করতে চান তবে বিদ্যমান মুছুন এবং নতুন বাচ্চাগুলি সন্নিবেশ করান আপনার অবশ্যই এমন কিছু করতে হবে:

var parent = context.Parents.GetById(1); // Make sure that childs are loaded as well
foreach(var child in modifiedParent.ChildItems)
{
    var attachedChild = FindChild(parent, child.Id);
    if (attachedChild != null)
    {
        // Existing child - apply new values
        context.Entry(attachedChild).CurrentValues.SetValues(child);
    }
    else
    {
        // New child
        // Don't insert original object. It will attach whole detached graph
        parent.ChildItems.Add(child.Clone());
    }
}

// Now you must delete all entities present in parent.ChildItems but missing
// in modifiedParent.ChildItems
// ToList should make copy of the collection because we can't modify collection
// iterated by foreach
foreach(var child in parent.ChildItems.ToList())
{
    var detachedChild = FindChild(modifiedParent, child.Id);
    if (detachedChild == null)
    {
        parent.ChildItems.Remove(child);
        context.Childs.Remove(child); 
    }
}

context.SaveChanges();

1
তবে ব্যবহার সম্পর্কে আপনার আকর্ষণীয় মন্তব্য রয়েছে .Clone()। আপনার কি মনে আছে যে ChildItemএকটিতে অন্যান্য উপ-শিশু নেভিগেশন বৈশিষ্ট্য রয়েছে? তবে সেক্ষেত্রে, আমরা কি চাইব না যে পুরো উপ-গ্রাফটি প্রসঙ্গে সংযুক্ত আছে, যেহেতু আমরা আশা করব যে শিশুটি নিজেই নতুন হলে সমস্ত উপ-শিশুরা নতুন বস্তু? (ঠিক আছে, মডেল থেকে মডেল হতে পারে আলাদা, তবে ধরা যাক সাব-শিশুরা যেমন সন্তানের কাছ থেকে "নির্ভরশীল" যেমন বাচ্চারা পিতা-মাতার উপর নির্ভরশীল))
স্লুমা

এটির জন্য সম্ভবত "স্মার্ট" ক্লোন প্রয়োজন হবে।
লাদিস্লাভ মৃঙ্কা

1
আপনি যদি আপনার প্রসঙ্গে সন্তানের সংগ্রহ করতে না চান তবে কী হবে? http://stackoverflow.com/questions/20233994/do-i-need-to-create-a-dbset-for-every-table-so-that-i-can-persist-child-entitie
কার্স্টেন লোভ

1
parent.ChildItems.Remove (শিশু); context.Childs.Remove (শিশু); এই ডাবল অপসারণ স্থির হতে পারে, ধন্যবাদ। কেন আমাদের উভয় অপসারণ প্রয়োজন? শিশুদের কেবল বাচ্চা হিসাবে বাঁচার কারণে কেন কেবলমাত্র পিতামাতার কাছ থেকে অপসারণ করা গুরুত্বপূর্ণ?
ফার্নান্দো টরেস

40

আমি এই উত্তরটি একই ত্রুটির জন্য আরও অনেক সহায়ক বলে মনে করেছি। দেখে মনে হচ্ছে আপনি সরানোর সময় EF পছন্দ করে না, এটি মুছুন পছন্দ করে pre

আপনি এর মতো একটি রেকর্ডের সাথে সংযুক্ত রেকর্ডের সংগ্রহ মুছতে পারেন।

order.OrderDetails.ToList().ForEach(s => db.Entry(s).State = EntityState.Deleted);

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


আমি বিশ্বাস করি এটির সঠিক উত্তর answer
দেশমত

যৌক্তিক এবং সোজা সমাধান।
সাইফান

19

আমি জানি না কেন অন্য দুটি উত্তর এত জনপ্রিয়?

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

আপনাকে " সনাক্তকারী সম্পর্ক " ব্যবহার করে পিতা-মাতার সম্পর্কের সঠিকভাবে সংজ্ঞা দিতে হবে

আপনি যদি এটি করেন, সত্তা ফ্রেমওয়ার্ক জানে যে শিশুটির পিতামাতাকে পিতামাতার দ্বারা চিহ্নিত করা হয়েছে, এবং সুতরাং এটি অবশ্যই "ক্যাসকেড-মুছা-এতিম" পরিস্থিতি হতে হবে।

উপরেরটি ব্যতীত আপনার প্রয়োজন হতে পারে (এনএইচবারনেট অভিজ্ঞতা থেকে)

thisParent.ChildItems.Clear();
thisParent.ChildItems.AddRange(modifiedParent.ChildItems);

পরিবর্তে পুরোপুরি তালিকা প্রতিস্থাপন।

হালনাগাদ

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


সম্পর্ক চিহ্নিতকরণ হিসাবে সেটআপ এখানে সহায়তা করবে না কারণ প্রশ্নটির দৃশ্যে বিচ্ছিন্ন সত্তা ( "আমার নতুন তালিকা যা এমভিসি ভিউ থেকে আসে" ) নিয়ে কাজ করে। আপনাকে এখনও ডিবি থেকে মূল বাচ্চাদের লোড করতে হবে, বিচ্ছিন্ন সংগ্রহের ভিত্তিতে সেই সংগ্রহে মুছে ফেলা আইটেমগুলি সন্ধান করতে হবে এবং তারপরে ডিবি থেকে অপসারণ করতে হবে। পার্থক্য হ'ল একটি সনাক্তকারী সম্পর্কের সাথে আপনি parent.ChildItems.Removeপরিবর্তে কল করতে পারেন _dbContext.ChildItems.Remove। অন্যান্য উত্তরের মতো লম্বা কোড এড়ানোর জন্য এখনও ইএফ থেকে অন্তর্নির্মিত সমর্থন নেই (EF <= 6)।
স্লুমা

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

হ্যাঁ, আপনি একটি মডেল বাইন্ডার ব্যবহার করতে পারেন তবে আপনাকে এখন মডেল বাইন্ডারের অন্যান্য উত্তরগুলি থেকে স্টাফটি করতে হবে। এটি কেবলমাত্র রেপো / পরিষেবা স্তর থেকে মডেল বাইন্ডারে নিয়ে যায়। কমপক্ষে, আমি আসল সরলকরণ দেখছি না।
স্লুমা

সরলীকরণ হ'ল অনাথ সত্তাগুলি স্বয়ংক্রিয়ভাবে মোছা। মডেল বাইন্ডারে আপনার যা যা প্রয়োজন তা হ'ল জেনেরিক সমতুল্যreturn context.Items.Find(id) ?? new Item()
আন্দ্রে লুস

ইএফ দলের পক্ষে ভাল প্রতিক্রিয়া, তবে আপনার প্রস্তাবিত সমাধান দুর্ভাগ্যক্রমে ইএফ জমিতে কোনও কিছুই সমাধান করে না।
ক্রিস মোসচিনি

9

আপনি যদি একই ক্লাসে অটোম্যাপারটি সত্তা ফ্রেমওয়ার্ক সহ ব্যবহার করে থাকেন তবে আপনি এই সমস্যাটি পেতে পারেন। উদাহরণস্বরূপ যদি আপনার ক্লাস হয়

class A
{
    public ClassB ClassB { get; set; }
    public int ClassBId { get; set; }
}

AutoMapper.Map<A, A>(input, destination);

এটি উভয় সম্পত্তি অনুলিপি করার চেষ্টা করবে। এক্ষেত্রে ক্লাসবিআইড নন-নালাইযোগ্য। যেহেতু অটোম্যাপার এটি অনুলিপি destination.ClassB = input.ClassB;করবে তাতে সমস্যা দেখা দেবে।

ClassBসম্পত্তিটিকে উপেক্ষা করার জন্য আপনার অটোম্যাপার সেট করুন ।

 cfg.CreateMap<A, A>()
     .ForMember(m => m.ClassB, opt => opt.Ignore()); // We use the ClassBId

আমি AutoMapper সঙ্গে একটি অনুরূপ সমস্যা সম্মুখীন, কিন্তু এই কাজ করে না আমাকে :( দেখুন stackoverflow.com/q/41430679/613605
J86

4

আমি ঠিক একই ত্রুটি ছিল। পিতা-মাতার সন্তানের সম্পর্কের সাথে আমার দুটি টেবিল রয়েছে তবে আমি শিশু টেবিলের টেবিল সংজ্ঞাতে বিদেশী কী কলামে "অন ডিলেট ক্যাসকেড" কনফিগার করেছি। সুতরাং আমি যখন ডাটাবেসে প্যারেন্ট সারিটি (এসকিউএল এর মাধ্যমে) ম্যানুয়ালি মুছব তখন এটি স্বয়ংক্রিয়ভাবে সন্তানের সারিগুলি মুছে ফেলবে।

তবে এটি EF তে কাজ করে না, এই থ্রেডে বর্ণিত ত্রুটিটি প্রদর্শিত হয়েছিল। এর কারণটি ছিল, আমার সত্তার ডেটা মডেলটিতে (এডএমএক্স ফাইল) পিতামাতার এবং সন্তানের সারণির মধ্যে অ্যাসোসিয়েশনের বৈশিষ্ট্যগুলি সঠিক ছিল না। End1 OnDeleteবিকল্প হতে কনফিগার করা হয়েছিল none(আমার মডেল "End1" শেষ যা 1 একটি সংখ্যাধিক্য আছে)।

আমি ম্যানুয়ালি End1 OnDeleteঅপশনটি পরিবর্তিত করেছিলাম Cascadeএবং এটি কাজ করে। আমি জানি না কেন আমি যখন ডাটাবেস থেকে মডেলটি আপডেট করি (তখন আমার কাছে একটি ডাটাবেস প্রথম মডেল রয়েছে) EF কেন এটি তুলতে সক্ষম নয়।

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

   public void Delete(int id)
    {
        MyType myObject = _context.MyTypes.Find(id);

        _context.MyTypes.Remove(myObject);
        _context.SaveChanges(); 
   }    

আমি যদি ক্যাসকেড মুছে ফেলা সংশোধন করতে না পারি, তবে পিতামাতার সারিটি মোছার আগে আমাকে নিজেই শিশু সারিগুলি মুছতে হবে।


4

এটি ঘটে কারণ শিশু সত্তা মোছার পরিবর্তে পরিবর্তিত হিসাবে চিহ্নিত হয়েছে।

EF শিশু সত্ত্বার parent.Remove(child)সাথে সম্পাদিত হওয়ার সময় যে পরিবর্তনটি করে তা কেবল তার পিতামাতার সাথে রেফারেন্স সেট করে null

এক্সিকিউট করার পরে ব্যতিক্রম ঘটে যখন আপনি ভিজ্যুয়াল স্টুডিওর তাত্ক্ষণিক উইন্ডোতে নিম্নলিখিত কোডটি লিখে সন্তানের অ্যান্টিস্টেট চেক করতে পারেন SaveChanges():

_context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified).ElementAt(X).Entity

যেখানে এক্স মুছে ফেলা সত্তা দ্বারা প্রতিস্থাপন করা উচিত।

যদি ObjectContextএক্সিকিউট করার জন্য আপনার অ্যাক্সেস না থাকে তবে আপনি _context.ChildEntity.Remove(child)বিদেশী কীটি শিশু টেবিলে প্রাথমিক কীটির অংশ হিসাবে তৈরি করে এই সমস্যাটি সমাধান করতে পারেন।

Parent
 ________________
| PK    IdParent |
|       Name     |
|________________|

Child
 ________________
| PK    IdChild  |
| PK,FK IdParent |
|       Name     |
|________________|

এইভাবে, আপনি যদি নির্বাহ করেন parent.Remove(child), EF সরিয়ে ফেলা হিসাবে সত্তাকে সঠিকভাবে চিহ্নিত করবে।


2

এই ধরণের সমাধানটি আমার পক্ষে কৌশলটি করেছে:

Parent original = db.Parent.SingleOrDefault<Parent>(t => t.ID == updated.ID);
db.Childs.RemoveRange(original.Childs);
updated.Childs.ToList().ForEach(c => original.Childs.Add(c));
db.Entry<Parent>(original).CurrentValues.SetValues(updated);

এটি গুরুত্বপূর্ণ যে এটি সমস্ত রেকর্ড মুছে ফেলে এবং সেগুলি আবার sertোকায়। তবে আমার ক্ষেত্রে (10 এর কম হলে) ঠিক আছে।

আমি আসা করি এটা সাহায্য করবে.


নতুন আইডি দিয়ে পুনরায় প্রবেশকরণটি ঘটে বা এটি তাদের প্রথম সন্তানের আইডি রাখে?
পেপিতো ফার্নান্দেজ

2

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

পূর্বে আমি নীচের কোডে এটি করছিলাম। তারপরে আমি এই প্রশ্নে একই ত্রুটি তালিকাভুক্ত করব।

var Parent = GetParent(parentId);
var children = Parent.Children;
foreach (var c in children )
{
     Context.Children.Remove(c);
}
Context.SaveChanges();

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

var children = GetChildren(parentId);
foreach (var c in children )
{
     Context.Children.Remove(c);
}
Context.SaveChanges();

var Parent = GetParent(parentId);
Parent.Children = //assign new entities/items here

2

আপনাকে চাইল্ড আইটেম সংগ্রহটি ম্যানুয়ালি মুছে ফেলতে হবে এবং এতে নতুন আইটেম যুক্ত করতে হবে:

thisParent.ChildItems.Clear();
thisParent.ChildItems.AddRange(modifiedParent.ChildItems);

এর পরে আপনি ডিলিটঅরফ্যানস এক্সটেনশন পদ্ধতিতে কল করতে পারবেন যা এতিম সংস্থাগুলি পরিচালনা করবে (এটি অবশ্যই ডিটেক্ট চেঞ্জস এবং সেভচেনজ পদ্ধতিগুলির মধ্যে কল করা উচিত)।

public static class DbContextExtensions
{
    private static readonly ConcurrentDictionary< EntityType, ReadOnlyDictionary< string, NavigationProperty>> s_navPropMappings = new ConcurrentDictionary< EntityType, ReadOnlyDictionary< string, NavigationProperty>>();

    public static void DeleteOrphans( this DbContext source )
    {
        var context = ((IObjectContextAdapter)source).ObjectContext;
        foreach (var entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified))
        {
            var entityType = entry.EntitySet.ElementType as EntityType;
            if (entityType == null)
                continue;

            var navPropMap = s_navPropMappings.GetOrAdd(entityType, CreateNavigationPropertyMap);
            var props = entry.GetModifiedProperties().ToArray();
            foreach (var prop in props)
            {
                NavigationProperty navProp;
                if (!navPropMap.TryGetValue(prop, out navProp))
                    continue;

                var related = entry.RelationshipManager.GetRelatedEnd(navProp.RelationshipType.FullName, navProp.ToEndMember.Name);
                var enumerator = related.GetEnumerator();
                if (enumerator.MoveNext() && enumerator.Current != null)
                    continue;

                entry.Delete();
                break;
            }
        }
    }

    private static ReadOnlyDictionary<string, NavigationProperty> CreateNavigationPropertyMap( EntityType type )
    {
        var result = type.NavigationProperties
            .Where(v => v.FromEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many)
            .Where(v => v.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.One || (v.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.ZeroOrOne && v.FromEndMember.GetEntityType() == v.ToEndMember.GetEntityType()))
            .Select(v => new { NavigationProperty = v, DependentProperties = v.GetDependentProperties().Take(2).ToArray() })
            .Where(v => v.DependentProperties.Length == 1)
            .ToDictionary(v => v.DependentProperties[0].Name, v => v.NavigationProperty);

        return new ReadOnlyDictionary<string, NavigationProperty>(result);
    }
}

এটি আমার পক্ষে ভাল কাজ করেছে। আমি শুধু যোগ করা প্রয়োজন context.DetectChanges();
অ্যান্ডি এডিনবারো

1

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

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

var toDelete = db.Parents.Find(parentObject.ID);
db.Parents.Remove(toDelete);
db.SaveChanges();

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


1

আমি মোশির সমাধানটি ব্যবহার করেছি , তবে কোডটিতে কীভাবে কম্পোজিশন কীটি সঠিকভাবে প্রয়োগ করা যায় তা আমার কাছে স্পষ্ট ছিল না।

সুতরাং সমাধান এখানে:

public class Holiday
{
    [Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int HolidayId { get; set; }
    [Key, Column(Order = 1), ForeignKey("Location")]
    public LocationEnum LocationId { get; set; }

    public virtual Location Location { get; set; }

    public DateTime Date { get; set; }
    public string Name { get; set; }
}

1

আমার একই সমস্যা ছিল, তবে আমি জানতাম যে এটি অন্যান্য ক্ষেত্রেও ঠিক কাজ করেছে, তাই আমি সমস্যাটি এখানে হ্রাস করেছি:

parent.OtherRelatedItems.Clear();  //this worked OK on SaveChanges() - items were being deleted from DB
parent.ProblematicItems.Clear();   // this was causing the mentioned exception on SaveChanges()
  • অন্যান্য সম্পর্কিত সম্পর্কিত আইটেমগুলির একটি যৌগিক প্রাথমিক কী (প্যারেন্টআইডি + কিছু স্থানীয় কলাম) ছিল এবং ঠিক আছে
  • সমস্যাযুক্ত আইটেমগুলির নিজস্ব একক-কলাম প্রাথমিক কী ছিল এবং প্যারেন্টআইডটি কেবল একটি এফকে ছিল। এটি ক্লিয়ার () এর পরে ব্যতিক্রম ঘটায়।

আমাকে যা করতে হয়েছিল তা হ'ল প্যারেন্টআইডকে যৌগিক পিকে-র একটি অংশ বানিয়ে বোঝানোর জন্য যে বাবা-মা ছাড়া বাচ্চারা থাকতে পারে না। আমি ডিবি-ফার্স্ট মডেলটি ব্যবহার করেছি, পিকে যুক্ত করেছি এবং প্যারেন্ট আইড কলামটি এন্টিকি হিসাবে চিহ্নিত করেছি (সুতরাং, আমি এটি ডিবি এবং ইএফ উভয়ই আপডেট করতে হয়েছিল - EF একা যথেষ্ট হবে কিনা তা নিশ্চিত নয়)।

আমি পিকে-র অংশ অনুরোধ করেছি of এবং তারপরে EF মডেলটি আপডেট করে এবং অন্য সম্পত্তিটি সত্ত্বা কী এর অংশ হিসাবে সেট করে

একবার আপনি এটি সম্পর্কে চিন্তাভাবনা করার পরে, এটি খুব মার্জিত পার্থক্য যা EF স্থির করে যে বাচ্চারা পিতামাতাকে বাদ দিয়ে "বোঝায়" (এই ক্ষেত্রে সাফ () তাদের মুছে ফেলবে না এবং ব্যতিক্রম নিক্ষেপ করবে না যদি আপনি প্যারেন্টআইডকে অন্য কোনও কিছু / বিশেষে সেট না করেন তবে ) বা - মূল প্রশ্নের মতো - আমরা প্রত্যাশা করি আইটেমগুলি পিতামাতার কাছ থেকে মুছে ফেলা হবে।


0

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

মডেলে dbcontext শ্রেণিতে পদ্ধতি তৈরি করুন।

 modelBuilder.Entity<Job>()
                .HasMany<JobSportsMapping>(C => C.JobSportsMappings)
                .WithRequired(C => C.Job)
                .HasForeignKey(C => C.JobId).WillCascadeOnDelete(true);
            modelBuilder.Entity<Sport>()
                .HasMany<JobSportsMapping>(C => C.JobSportsMappings)
                  .WithRequired(C => C.Sport)
                  .HasForeignKey(C => C.SportId).WillCascadeOnDelete(true);

এর পরে, আমাদের এপিআই কল In

var JobList = Context.Job                       
          .Include(x => x.JobSportsMappings)                                     .ToList();
Context.Job.RemoveRange(JobList);
Context.SaveChanges();

কাসকেড মোছার বিকল্পটি এই সাধারণ কোড সহ পিতামাতার পাশাপাশি পিতা-মাতার সাথে সম্পর্কিত শিশু টেবিলটিকে মুছুন। এই সহজ উপায়ে চেষ্টা করুন।

ধন্যবাদ ডেটাবেস রেকর্ডের তালিকা মুছে ফেলার জন্য ব্যবহৃত পরিসীমা সরান


0

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

অন্যান্য সমাধানের জন্য আমি এই ব্লগ পোস্টটিও সুপারিশ করতে পারি:

http://www.kianryan.co.uk/2013/03/orphaned-child/

কোড:

public class Child
{
    [Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string Heading { get; set; }
    //Add other properties here.

    [Key, Column(Order = 1)]
    public int ParentId { get; set; }

    public virtual Parent Parent { get; set; }
}

0

স্লুমার সমাধানটি ব্যবহার করে, আমি শিশুদের অবজেক্টগুলি এবং শিশু সামগ্রীর সংগ্রহ আপডেট করতে সহায়তা করার জন্য কিছু জেনেরিক ফাংশন তৈরি করেছি।

আমার সমস্ত অবিচলিত অবজেক্ট এই ইন্টারফেসটি প্রয়োগ করে

/// <summary>
/// Base interface for all persisted entries
/// </summary>
public interface IBase
{
    /// <summary>
    /// The Id
    /// </summary>
    int Id { get; set; }
}

এটির সাহায্যে আমি আমার সংগ্রহশালায় এই দুটি ফাংশন বাস্তবায়ন করেছি

    /// <summary>
    /// Check if orgEntry is set update it's values, otherwise add it
    /// </summary>
    /// <param name="set">The collection</param>
    /// <param name="entry">The entry</param>
    /// <param name="orgEntry">The original entry found in the database (can be <code>null</code> is this is a new entry)</param>
    /// <returns>The added or updated entry</returns>
    public T AddOrUpdateEntry<T>(DbSet<T> set, T entry, T orgEntry) where T : class, IBase
    {
        if (entry.Id == 0 || orgEntry == null)
        {
            entry.Id = 0;
            return set.Add(entry);
        }
        else
        {
            Context.Entry(orgEntry).CurrentValues.SetValues(entry);
            return orgEntry;
        }
    }

    /// <summary>
    /// check if each entry of the new list was in the orginal list, if found, update it, if not found add it
    /// all entries found in the orignal list that are not in the new list are removed
    /// </summary>
    /// <typeparam name="T">The type of entry</typeparam>
    /// <param name="set">The database set</param>
    /// <param name="newList">The new list</param>
    /// <param name="orgList">The original list</param>
    public void AddOrUpdateCollection<T>(DbSet<T> set, ICollection<T> newList, ICollection<T> orgList) where T : class, IBase
    {
        // attach or update all entries in the new list
        foreach (T entry in newList)
        {
            // Find out if we had the entry already in the list
            var orgEntry = orgList.SingleOrDefault(e => e.Id != 0 && e.Id == entry.Id);

            AddOrUpdateEntry(set, entry, orgEntry);
        }

        // Remove all entries from the original list that are no longer in the new list
        foreach (T orgEntry in orgList.Where(e => e.Id != 0).ToList())
        {
            if (!newList.Any(e => e.Id == orgEntry.Id))
            {
                set.Remove(orgEntry);
            }
        }
    }

এটি ব্যবহারের জন্য আমি নিম্নলিখিতগুলি করি:

var originalParent = _dbContext.ParentItems
    .Where(p => p.Id == parent.Id)
    .Include(p => p.ChildItems)
    .Include(p => p.ChildItems2)
    .SingleOrDefault();

// Add the parent (including collections) to the context or update it's values (except the collections)
originalParent = AddOrUpdateEntry(_dbContext.ParentItems, parent, originalParent);

// Update each collection
AddOrUpdateCollection(_dbContext.ChildItems, parent.ChildItems, orgiginalParent.ChildItems);
AddOrUpdateCollection(_dbContext.ChildItems2, parent.ChildItems2, orgiginalParent.ChildItems2);

আশাকরি এটা সাহায্য করবে


অতিরিক্ত: আপনি একটি পৃথক DbContextExtentions (বা আপনার নিজস্ব প্রসঙ্গ অনুভূতি) বর্গও তৈরি করতে পারেন:

public static void DbContextExtentions {
    /// <summary>
    /// Check if orgEntry is set update it's values, otherwise add it
    /// </summary>
    /// <param name="_dbContext">The context object</param>
    /// <param name="set">The collection</param>
    /// <param name="entry">The entry</param>
    /// <param name="orgEntry">The original entry found in the database (can be <code>null</code> is this is a new entry)</param>
    /// <returns>The added or updated entry</returns>
    public static T AddOrUpdateEntry<T>(this DbContext _dbContext, DbSet<T> set, T entry, T orgEntry) where T : class, IBase
    {
        if (entry.IsNew || orgEntry == null) // New or not found in context
        {
            entry.Id = 0;
            return set.Add(entry);
        }
        else
        {
            _dbContext.Entry(orgEntry).CurrentValues.SetValues(entry);
            return orgEntry;
        }
    }

    /// <summary>
    /// check if each entry of the new list was in the orginal list, if found, update it, if not found add it
    /// all entries found in the orignal list that are not in the new list are removed
    /// </summary>
    /// <typeparam name="T">The type of entry</typeparam>
    /// <param name="_dbContext">The context object</param>
    /// <param name="set">The database set</param>
    /// <param name="newList">The new list</param>
    /// <param name="orgList">The original list</param>
    public static void AddOrUpdateCollection<T>(this DbContext _dbContext, DbSet<T> set, ICollection<T> newList, ICollection<T> orgList) where T : class, IBase
    {
        // attach or update all entries in the new list
        foreach (T entry in newList)
        {
            // Find out if we had the entry already in the list
            var orgEntry = orgList.SingleOrDefault(e => e.Id != 0 && e.Id == entry.Id);

            AddOrUpdateEntry(_dbContext, set, entry, orgEntry);
        }

        // Remove all entries from the original list that are no longer in the new list
        foreach (T orgEntry in orgList.Where(e => e.Id != 0).ToList())
        {
            if (!newList.Any(e => e.Id == orgEntry.Id))
            {
                set.Remove(orgEntry);
            }
        }
    }
}

এবং এটি ব্যবহার করুন:

var originalParent = _dbContext.ParentItems
    .Where(p => p.Id == parent.Id)
    .Include(p => p.ChildItems)
    .Include(p => p.ChildItems2)
    .SingleOrDefault();

// Add the parent (including collections) to the context or update it's values (except the collections)
originalParent = _dbContext.AddOrUpdateEntry(_dbContext.ParentItems, parent, originalParent);

// Update each collection
_dbContext.AddOrUpdateCollection(_dbContext.ChildItems, parent.ChildItems, orgiginalParent.ChildItems);
_dbContext.AddOrUpdateCollection(_dbContext.ChildItems2, parent.ChildItems2, orgiginalParent.ChildItems2);

আপনি এই ফাংশনগুলির সাথে আপনার প্রসঙ্গের জন্য একটি এক্সটেনশান ক্লাসও তৈরি করতে পারেন:
ব্লুমুন 74৪

0

যখন আমি আমার সমস্যা রেকর্ডিং করতে যাচ্ছিলাম তখনও আমি একই সমস্যার মুখোমুখি হয়েছি কারণ এই সমস্যার সমাধান হ'ল হেডার / মাস্টার রেকর্ড মুছার আগে আপনি কিছু রেকর্ডিং করার চেয়ে আপনার রেকর্ডটি মুছতে চলেছেন তখন আপনাকে অবশ্যই কোডটিতে লিখতে হবে শিরোনাম / মাস্টার এর আগে এর বিশদটি মুছুন আমি আশা করি আপনার সমস্যার সমাধান হবে।


-1

আমি বেশ কয়েক ঘন্টা আগে এই সমস্যাটির মুখোমুখি হয়েছি এবং সবকিছু চেষ্টা করেছি, তবে আমার ক্ষেত্রে সমাধানটি উপরে তালিকাভুক্ত থেকে আলাদা ছিল।

আপনি যদি ইতিমধ্যে ডাটাবেস থেকে পুনরুদ্ধারকৃত সত্তা ব্যবহার করেন এবং এটির শিশুদের সংশোধন করার চেষ্টা করেন ত্রুটি ঘটবে তবে আপনি যদি ডাটাবেস থেকে সত্তার নতুন কপি পেয়ে থাকেন তবে কোনও সমস্যা হবে না। এটি ব্যবহার করবেন না:

 public void CheckUsersCount(CompanyProduct companyProduct) 
 {
     companyProduct.Name = "Test";
 }

এটা ব্যবহার কর:

 public void CheckUsersCount(Guid companyProductId)
 {
      CompanyProduct companyProduct = CompanyProductManager.Get(companyProductId);
      companyProduct.Name = "Test";
 }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.