সত্তা ফ্রেমওয়ার্ক রিফ্রেশ প্রসঙ্গে?


101

আমি কীভাবে আমার প্রসঙ্গে রিফ্রেশ করতে পারি? আমার ডেটাবেস থেকে দর্শনের উপর ভিত্তি করে সত্তা রয়েছে এবং যখন আমি একটি টেবিলের উপরে আপডেট করেছি যখন সত্ত্বার দর্শনগুলিতে নেভিগেশন বৈশিষ্ট্য রয়েছে, সত্তাটি আপডেট হয় তবে নতুন আপডেটগুলি অনুযায়ী ভিউ রিফ্রেশ হয় না ... কেবল আবার থেকে পেতে চাই ডিবি ডেটা। ধন্যবাদ!

উত্তর:


92

আপনার প্রসঙ্গে সত্তাগুলি সতেজ করার সর্বোত্তম উপায় হ'ল আপনার প্রসঙ্গটি নিষ্পত্তি করা এবং একটি নতুন তৈরি করা।

আপনার যদি সত্যিই কিছু সত্তা রিফ্রেশ করতে হবে এবং আপনি DbContext শ্রেণীর সাথে কোড ফার্স্ট পদ্ধতির ব্যবহার করছেন তবে আপনি ব্যবহার করতে পারেন

    public static void ReloadEntity<TEntity>(
        this DbContext context, 
        TEntity entity)
        where TEntity : class
    {
        context.Entry(entity).Reload();
    }

সংগ্রহ নেভিগেশন বৈশিষ্ট্যগুলি পুনরায় লোড করতে, আপনি ব্যবহার করতে পারেন

    public static void ReloadNavigationProperty<TEntity, TElement>(
        this DbContext context, 
        TEntity entity, 
        Expression<Func<TEntity, ICollection<TElement>>> navigationProperty)
        where TEntity : class
        where TElement : class
    {
        context.Entry(entity).Collection<TElement>(navigationProperty).Query();
    }

রেফারেন্স: https://msdn.microsoft.com/en-us/library/system.data.entity.inf पाया.dbentityentry.reload( v =vs.113) .aspx# M: Sstm.Data.Entity.Inf पाया. DbEntityEntry .রেলোড


4
শিশু নেভিগেশন বৈশিষ্ট্যগুলি পুনরায় লোড করার জন্য এটি কাজ করতে পারি না।
পল

@ ডেভিড আপনার কাছে context.ReloadNavigationProperty(parent, p => p.Children);থাকলে আপনি ব্যবহার করতে পারেনclass Parent { ICollection<Child> Children; }
জিনজিনভ

EF Core এ আপনি ক্যোয়ারী () লোড () ব্যবহার করতে পারেন উদাহরণস্বরূপcontext.Entry(order).Collection(o => o.NavigationProperty).Query().Load();
রুবিনিসমে

এই সমাধানটি এত বেশি কেন ভোট দেওয়া হয়েছে তা আমি বুঝতে পারি না। প্রসঙ্গ.এন্ট্রি (সত্তা)। সংগ্রহ <<<<< (নেভিগেশনপ্রোপার্টি) Qu কোয়েরি () শিশু সংগ্রহ পুনরায় লোড করে না। এটি কেবল সংগ্রহ পেতে ব্যবহৃত ক্যোয়ারীর প্রতিনিধিত্ব করে একটি Iqueryable দেয়। এটি আক্ষরিক কিছুই করে না।
স্ট্যাটলার

72
yourContext.Entry(yourEntity).Reload();

4
সহজ সমাধানের জন্য ধন্যবাদ। আরএক্স_ডিআইডি_আরএক্সের মতো এক্সটেনশন পদ্ধতিতে এটি আবশ্যকতাটি আমি দেখছি না
টমাস

এটি আমার জন্য জীবনকাল ছিল। ধন্যবাদ!
কেভিন

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

28

আপনি যদি DbContextApi এর সাথে সুনির্দিষ্ট সত্তাগুলি পুনরায় লোড করতে চান তবে আরএক্স_ডিআইডি_আরএক্স ইতিমধ্যে আপনাকে উত্তরটি দিয়েছিল।

আপনি যদি লোড করেছেন এমন সমস্ত সত্তা পুনরায় লোড / রিফ্রেশ করতে চান:

আপনি যদি সত্ত্বা ফ্রেমওয়ার্ক 4.1+ (EF5, বা EF 6 সম্ভবত) ব্যবহার করেন তবে DbContext API:

public void RefreshAll()
{
     foreach (var entity in ctx.ChangeTracker.Entries())
     {
           entity.Reload();
     }
}

আপনি যদি অ্যান্টিফ্রেমওয়ার্ক 4 (অবজেক্ট কনটেক্সট এপিআই) ব্যবহার করছেন:

public void RefreshAll()
{
     // Get all objects in statemanager with entityKey
     // (context.Refresh will throw an exception otherwise)
     var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted
                                               | EntityState.Modified
                                               | EntityState.Unchanged)
                                      where entry.EntityKey != null
                                      select entry.Entity);

     context.Refresh(RefreshMode.StoreWins, refreshableObjects);
}

যাইহোক সর্বোত্তম পরামর্শ হ'ল "স্বল্পস্থায়ী প্রসঙ্গ" ব্যবহার করার চেষ্টা করুন এবং আপনি এই ধরণের সমস্যা এড়াতে পারেন।

বিষয়টি নিয়ে আমি বেশ কয়েকটি নিবন্ধ লিখেছিলাম:

https://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/


সুন্দর!! আমার দিন বাঁচা!
রাদু ডি

16

রিফ্রেশ পদ্ধতিটি ব্যবহার করুন :

context.Refresh(RefreshMode.StoreWins, yourEntity);

বা বিকল্প হিসাবে আপনার বর্তমান প্রসঙ্গে নিষ্পত্তি এবং একটি নতুন তৈরি করুন।


@ জেএমকে এখানে ঠিক কী কাজ করে না? এটি আমার পক্ষে ভাল কাজ করে বলে মনে হচ্ছে (EF 6.1.1)।
সেবাস্তিয়ান ক্রিসমানস্কি

@ সেবাস্তিয়ান ক্রাইসম্যানস্কি আমি প্রায় এক বছর আগে মন্তব্য করেছি, সম্ভবত এটি ঠিক হয়ে গেছে?
জেএমকে

5
আমি মনে করি যে এটি কেবল অবজেক্টটেক্সট জন্য কাজ করে তবে dbcontext নয়। তাদের মধ্যে কথোপকথন প্রয়োজন
এমিল

4
@ ব্যাটমসি যা দিয়ে সহজেই করা যায়((IObjectContextAdapter)dbContext).ObjectContext
ড্যানিয়েল জেড।

4
যা এতটা অসম্পূর্ণ বলা হয়নি।
ব্যবহারকারী 441521


1

ইএফ 6

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

private void RefreshData(DBEntity entity)
{
    if (entity == null) return;

    ((IObjectContextAdapter)DbContext).ObjectContext.RefreshAsync(RefreshMode.StoreWins, entity);
}

private void RefreshData(List<DBEntity> entities)
{
    if (entities == null || entities.Count == 0) return;

    ((IObjectContextAdapter)DbContext).ObjectContext.RefreshAsync(RefreshMode.StoreWins, entities);
}

4
আমি EF6 এর সাথে আছি। কেন এটি একটি চেয়ে ভাল _context.Entry(entity).Reload();?
সিএসবা তোথ

যতদূর আমি মনে করতে পারি, .Reload()EF6 এ উপলব্ধ নয়। @ সিএসবাটোথ
মাহবুবুর রহমান

0

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

using (YourContext ctx = new YourContext())
{
   //Your operations
}

6
ডুড .. আপনার প্রসঙ্গটি প্রতিবার ডাম্পিং করা আপনার পছন্দসই জিনিসগুলি সতেজ করা হবে যা প্রকৃতপক্ষে পারফরম্যান্স সমস্যার কারণ হতে পারে।
ভাগ্যবানলাই

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

5
আপনি এবং সমালোচনা না করে কিছু নমুনা দেখালে এটি আমার এবং অন্যদের জন্য দরকারী।
aog

ছোট ওয়েবসাইটের জন্য এটি জরিমানা।
অলিকুলি

-1

প্রকৃতপক্ষে আমি নিম্নলিখিতটি করার পরামর্শ দিই যে আমার কোডটিতে এই কোডটি ফর্ম তৈরি করছে এবং এটি ডায়ালগ হিসাবে প্রদর্শিত হবে ডাটাবেজে রিফ্রেশ ডেটা বাতিল করার পরে press

NewJobOrder newJobOrder = new NewJobOrder();
    newJobOrder.ShowDialog();
    if (newJobOrder.DialogResult == DialogResult.Cancel)
    {
        this.jobOrderTableAdapter.Fill(this.multiTechDBDataSet.JobOrder);
        }

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

-7

আমি নিজের মাথাটিকে কোনও কিছুর উপরে আঘাত করে নিই! উত্তরটি খুব সহজ ছিল - আমি কেবলমাত্র বেসিকগুলিতে ফিরে গিয়েছিলাম ...

some_Entities   e2 = new some_Entities(); //your entity.

আপডেট / ডিলিট করার পরে নীচে এই লাইনটি যুক্ত করুন - আপনি নিজের সত্ত্বাটি পুনরায় লোড করছেন - কোনও অভিনব সিস্টেম পদ্ধতি নেই।

e2 = new some_Entities(); //reset.

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