অনেক সত্তা ফ্রেমওয়ার্ক অনেককে সন্নিবেশ / আপডেট করুন। আমি এটা কিভাবে করব?


104

আমি EF4 এবং এটিতে নতুন ব্যবহার করছি new আমার প্রকল্পে আমার অনেকের কাছে অনেকগুলি রয়েছে এবং কীভাবে sertোকানো বা আপডেট করা যায় তা নিয়ে কাজ করে বলে মনে হচ্ছে না। আমি কীভাবে কোডিং করা উচিত তা দেখার জন্য আমি একটি ছোট প্রকল্প তৈরি করেছি।

ধরুন আমার কাছে 3 টি টেবিল রয়েছে

  1. শ্রেণি: ClassID-ClassName
  2. ছাত্র: স্টুডেন্টআইডি-ফার্স্টনাম-અટর
  3. স্টুডেন্ট ক্লাস: স্টুডেন্টআইডি-ক্লাসিড

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

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

উত্তর:


139

সত্তার (বা অবজেক্ট) পদগুলির ক্ষেত্রে আপনার একটি Classঅবজেক্ট রয়েছে যার সংকলন রয়েছে Studentsএবং একটি Studentঅবজেক্টের সংকলন রয়েছে Classes। যেহেতু আপনার StudentClassটেবিলটিতে কেবল আইডি রয়েছে এবং কোনও অতিরিক্ত তথ্য নেই, তাই EF যোগদানের টেবিলের জন্য কোনও সত্তা তৈরি করে না। এটি সঠিক আচরণ এবং এটিই আপনি প্রত্যাশা করেন।

এখন, সন্নিবেশ বা আপডেটগুলি করার সময়, অবজেক্টের দিক থেকে চিন্তা করার চেষ্টা করুন। উদাহরণস্বরূপ, আপনি যদি দুটি শিক্ষার্থীর সাথে একটি শ্রেণি সন্নিবেশ করতে চান, Classঅবজেক্টটি তৈরি করুন , Studentঅবজেক্টগুলি তৈরি করুন, শিক্ষার্থীদের ক্লাস Studentsসংগ্রহে যুক্ত করুন তবে Classঅবজেক্টটিকে প্রসঙ্গে যুক্ত করুন এবং কল করুন SaveChanges:

using (var context = new YourContext())
{
    var mathClass = new Class { Name = "Math" };
    mathClass.Students.Add(new Student { Name = "Alice" });
    mathClass.Students.Add(new Student { Name = "Bob" });

    context.AddToClasses(mathClass);
    context.SaveChanges();
}

এই একটি এন্ট্রি তৈরি করবে Classটেবিল দুটি এন্ট্রি Studentটেবিল এবং দুটি এন্ট্রি StudentClassতাদের একসঙ্গে লিঙ্ক টেবিল।

আপনি মূলত আপডেটগুলির জন্য একই কাজ করেন। কেবল তথ্য সংগ্রহ করুন, সংগ্রহ থেকে কলগুলি এবং কলগুলি বাদ দিয়ে গ্রাফটি পরিবর্তন করুন SaveChanges। পরীক্ষা করে দেখুন এই একই প্রশ্ন বিস্তারিত জানার জন্য।

সম্পাদনা করুন :

আপনার মন্তব্য অনুসারে, আপনাকে একটি নতুন sertোকানো Classএবং Studentsএটিতে দুটি বিদ্যমান যুক্ত করতে হবে:

using (var context = new YourContext())
{
    var mathClass= new Class { Name = "Math" };
    Student student1 = context.Students.FirstOrDefault(s => s.Name == "Alice");
    Student student2 = context.Students.FirstOrDefault(s => s.Name == "Bob");
    mathClass.Students.Add(student1);
    mathClass.Students.Add(student2);

    context.AddToClasses(mathClass);
    context.SaveChanges();
}

যেহেতু উভয় শিক্ষার্থী ইতিমধ্যে ডাটাবেসে রয়েছে, সেগুলি সন্নিবেশ করা হবে না, তবে যেহেতু তারা এখন Studentsসংগ্রহে রয়েছে Class, দুটি প্রবেশিকা StudentClassসারণিতে প্রবেশ করানো হবে ।


হাই, আপনার জবাবের জন্য ধন্যবাদ y আমার পরিস্থিতি হ'ল আমার ক্লাসে 1 টি প্রবেশ এবং এক্স مثال হিসাবে 2 স্টুডেন্ট ক্লাসে প্রবেশ করাতে হবে এবং শিক্ষার্থীর মধ্যে কোনও প্রবেশ নেই I আমি কীভাবে করব তা বিভ্রান্ত করছি
user9969

যেটি একটি চিকিত্সা করেছে
ব্যবহারকারী 9969

3
এটি ডাটাবেস থেকে যে আইটেমগুলিকে যুক্ত করতে হবে তা থেকে ওভারহেড যুক্ত হবে। সংযুক্তি পদ্ধতিটি কেবল একটি সম্পর্ক যুক্ত করতে ব্যবহার করা যেতে পারে। দেখুন msdn.microsoft.com/en-us/data/jj592676.aspx এবং stackoverflow.com/questions/11355019/...
Gnomo

3
অ্যাডটোক্লাস ক্লাসের জন্য ডিবিসেট?
জো স্মু

1
ক্লাস এবং শিক্ষার্থীর জন্য কনস্ট্রাক্টরগুলিতে আপনার সংগ্রহগুলি আরম্ভ করতে ভুলবেন না। উদাহরণস্বরূপ: পাবলিক ক্লাস () {this. স্টুডেন্টস = নতুন হ্যাশসেট <স্টুডেন্ট> (); }
ব্যবহারকারী 1040323

40

আপডেট করার জন্য এটি ব্যবহার করে দেখুন:

[HttpPost]
public ActionResult Edit(Models.MathClass mathClassModel)
{
    //get current entry from db (db is context)
    var item = db.Entry<Models.MathClass>(mathClassModel);

    //change item state to modified
    item.State = System.Data.Entity.EntityState.Modified;

    //load existing items for ManyToMany collection
    item.Collection(i => i.Students).Load();

    //clear Student items          
    mathClassModel.Students.Clear();

    //add Toner items
    foreach (var studentId in mathClassModel.SelectedStudents)
    {
        var student = db.Student.Find(int.Parse(studentId));
        mathClassModel.Students.Add(student);
    }                

    if (ModelState.IsValid)
    {
       db.SaveChanges();
       return RedirectToAction("Index");
    }

    return View(mathClassModel);
}

এই আমার দিন বাঁচাতে ধন্যবাদ আপনাকে !!! তারা আইটেম হওয়ার মূল অংশ Col সংগ্রহ (i => আই। স্টুডেন্টস) L লোড (); অংশ
গেরি প্রিটোরিয়াস

কেবল একটি পার্শ্ব নোট, এটি করার সময় আমার একটি অবৈধপ্রকাশের ধারণা ছিল, প্রসঙ্গটিতে আমার সত্তার মতো কিছু উপস্থিত ছিল না। আমি কেবল প্রসঙ্গকে ফোন করেছি। এটি মোকাবেলায় আমার এন্টিটি কালেকশন Aএটাচ (মাইএনটিটি)।
কিলাজুর

কখনই বুঝতে পারত না। অসংখ্য ধন্যবাদ.
জ্যারেড বিচ

1
আমাকে আমার ধন্যবাদ যোগ করার অনুমতি দিন। এই কাজটি সম্পাদন করার চেষ্টা করে আমি গত 4 দিনে 130 টিরও বেশি লাইন কোড লিখেছি এবং পরীক্ষিত করেছি কিন্তু এটি করতে পারিনি। এটি চেষ্টা করেছে এবং জিনিসগুলি পুরোপুরি কার্যকর হয়েছিল। আমি আইটেমের পরিবর্তনশীল প্রতিষ্ঠার উদ্দেশ্যটি বুঝতে পারি না এবং তারপরে এটি মোটেও ব্যবহার না করে, আমি এটি কাজ করে আনন্দিত! ধন্যবাদ এক মিলিয়ন বাজিলিয়ন !!!! :)
ডিউড-ডাস্টিক

প্রশ্নটি ইনসার্ট এবং আপডেট হিসাবে বিবেচনা করা হচ্ছে, এই উত্তরটি প্রশ্ন এবং স্বীকৃত উত্তর সম্পূর্ণ করে। আপনাকে অনেক ধন্যবাদ!
Vahx

5

আমি আমার অভিজ্ঞতা যোগ করতে চেয়েছিলাম। প্রকৃতপক্ষে EF, আপনি প্রসঙ্গে কোনও বস্তু যুক্ত করলে এটি সমস্ত বাচ্চার এবং সম্পর্কিত সংস্থাগুলির অ্যাডে পরিবর্তন করে। যদিও এখানে নিয়মে একটি সামান্য ব্যতিক্রম রয়েছে: যদি শিশু / সম্পর্কিত সত্ত্বাগুলি একই প্রসঙ্গে ট্র্যাক করা হয় তবে EF বুঝতে পারে না যে এই সত্তাগুলি বিদ্যমান রয়েছে এবং সেগুলি যুক্ত করে না। সমস্যাটি ঘটে যখন উদাহরণস্বরূপ, আপনি বাচ্চাদের / সম্পর্কিত সত্ত্বাগুলি অন্য কোনও প্রসঙ্গ বা ওয়েব ইউআই ইত্যাদি থেকে লোড করুন এবং তারপরে হ্যাঁ, EF এই সত্ত্বাগুলি সম্পর্কে কিছুই জানে না এবং গিয়ে সেগুলি সমস্ত যুক্ত করে। এটি এড়াতে, সত্ত্বার কীগুলি পান এবং সেগুলি সন্ধান করুন (যেমন context.Students.FirstOrDefault(s => s.Name == "Alice"))একই প্রসঙ্গে আপনি সংযোজন করতে চান)।


3

আমি কেবলমাত্র বিদেশী চাবি জড়িত রয়েছে এমন বহু-বহু সম্পর্কের পরিচালনা করতে নিম্নলিখিত উপায়টি ব্যবহার করি।

সন্নিবেশ করার জন্য :

public void InsertStudentClass (long studentId, long classId)
{
    using (var context = new DatabaseContext())
    {
        Student student = new Student { StudentID = studentId };
        context.Students.Add(student);
        context.Students.Attach(student);

        Class class = new Class { ClassID = classId };
        context.Classes.Add(class);
        context.Classes.Attach(class);

        student.Classes = new List<Class>();
        student.Classes.Add(class);

        context.SaveChanges();
    }
}

জন্য মোছার ,

public void DeleteStudentClass(long studentId, long classId)
{
    Student student = context.Students.Include(x => x.Classes).Single(x => x.StudentID == studentId);

    using (var context = new DatabaseContext())
    {
        context.Students.Attach(student);
        Class classToDelete = student.Classes.Find(x => x.ClassID == classId);
        if (classToDelete != null)
        {
            student.Classes.Remove(classToDelete);
            context.SaveChanges();
        }
    }
}

1

সত্তা ফ্রেমওয়ার্কে, যখন বস্তুকে প্রসঙ্গে যুক্ত করা হয়, তখন এর রাজ্যটি যুক্ত হয়। ইএফ প্রতিটি বস্তুর স্থিতিও বস্তু গাছের সাথে যুক্ত করে এবং তাই আপনি প্রাথমিক কী লঙ্ঘন ত্রুটি পেয়ে যাচ্ছেন বা নকল রেকর্ডগুলি টেবিলে যুক্ত করা হবে।


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