প্রথম জিজ্ঞাসাবাদ ছাড়াই একটি রেকর্ড আপডেট করবেন?


107

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

স্বতন্ত্র আইটেমটির রেকর্ড আনতে পারি না এমন কোনও উপায় কি আমি ডাটাবেস রেকর্ড আপডেট করতে পারি?

আমি এখন এটি কীভাবে করছি তা এখানে একটি নমুনা দেওয়া হল:

dataItem itemToUpdate = (from t in dataEntity.items
                                 where t.id == id
                                 select t).FirstOrDefault();

তারপরে রেকর্ডটি টানানোর পরে আমি আইটেমটিতে কিছু মান আপডেট করে রেকর্ডটি পিছনে ফেলে দেই:

itemToUpdate.itemstatus = newStatus;
dataEntity.SaveChanges();

আমি মনে করি এটি করার আরও ভাল উপায় হতে পারে, কোন ধারণা?


4
এটি জিনিসগুলি করা খুব খারাপ উপায় নয়। আপনার কি সেই টেবিলে একযোগে অ্যাক্সেস রয়েছে?
হেন্ক হলটারম্যান

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

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

4
ওআরএম পদ্ধতির প্রকৃত অবজেক্টগুলির জন্য সূক্ষ্ম, তবে আপনি যদি নিজের ডাটাবেসে অন্যান্য জিনিসও সংরক্ষণ করেন (বৃহত বাইনারি ব্লবগুলির মতো) প্রথমে মূল বিষয়বস্তুগুলি লোড না করে সেগুলি আপডেট করতে সক্ষম হওয়া খুব দরকারী super
BrainSlugs83

উত্তর:


69

আপনার সংযুক্তি () পদ্ধতিটি ব্যবহার করা উচিত ।

বিষয়গুলি সংযুক্ত করা এবং পৃথক করা


17
আপনি একটি উদাহরণ প্রদান করতে পারেন?
বার্ট ক্যালিক্সটো

17
প্রসঙ্গ.প্রডাক্ট.আটাচ (পণ্য); প্রসঙ্গ.এন্ট্রি (পণ্য)। স্টেট = সত্তা স্টেট.মোডিফায়েড;
গ্যাব্রিয়েল

7
@ গ্যাব্রিয়েল কি এই সমস্ত বৈশিষ্ট্য আপডেট করবে না? আমি যদি কেবল একটি একক পরিবর্তন করতে চাই তবে কী হবে?
ডেভিড ফেফার

23
হ্যাঁ এটি সমস্ত বৈশিষ্ট্য আপডেট করবে। আপনি যদি একটি একক সম্পত্তি আপডেট করতে চান তবে আপনি এটি করতে পারেন: প্রসঙ্গ Eশক্তি (ব্যবহারকারী)। (ক বর্ণন এখানে stackoverflow.com/a/5567616/57369 )
গাব্রিয়েল

6
আমি কেবল সেই প্রসঙ্গটি যুক্ত করতে চাই Eএন্ট্রি () কেবলমাত্র নেট 4.1 এ উপলব্ধ, যদি আপনি এখনও 4.0 (আমার মত) ব্যবহার করে থাকেন তবে বিকল্পটির জন্য এটি পরীক্ষা করে দেখুন: stackoverflow.com প্রাসঙ্গিক-এন্ট্রি যা মূলত: প্রসঙ্গ.অজেক্টস্টেটমনেজ.চেন্জঅবজেক্ট স্টেট (আপনারঅজেক্ট, সত্তা স্টেট.মোডিফায়েড);
ডিসলেক্সিকানবাবোক

40

আপনি ডাটাস্টোরের প্রসঙ্গটি ব্যবহার করে ডাটাবেসের বিরুদ্ধে সরাসরি এসকিউএল ব্যবহার করতে পারেন। উদাহরণ:

dataEntity.ExecuteStoreCommand
   ("UPDATE items SET itemstatus = 'some status' WHERE id = 123 ");

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

dataEntity.ExecuteStoreCommand
   ("UPDATE items SET itemstatus = 'some status' WHERE id = {0}", new object[] { 123 });

আপডেট - EF 6.0 এর জন্য

dataEntity.Database.ExecuteSqlCommand
       ("UPDATE items SET itemstatus = 'some status' WHERE id = {0}", new object[] { 123 });

10
আপনি কেন কোনও মন্তব্য না করে এই উত্তরটি হ্রাস করবেন। এই পরামর্শটি মূল লেখকদের প্রশ্ন স্পট-অনকে সম্বোধন করে।
ব্যারিপিকার

19
ExecuteStoreCommandসত্যিই এই কাজ করার একটি মতিন উপায় নয়, এটা ঠিক ব্যবহার করছে DbConnectionভিতরে অন্তর্ভুক্ত DbContextকমান্ড চালানো। এটি ডেটাবেস অজ্ঞেয়বাদী নয়, একাকী অজানাস্টিক যাক (উদাহরণস্বরূপ, ওপি যদি এক্সএমএল পরিবর্তন করে তবে এই উদাহরণটি ক্র্যাশ হবে)।
just.another.programmer

10
@ just.another.programmer - দুর্দান্ত শক্তির সাথে দুর্দান্ত দায়িত্ব আসে।
ব্যারিপিকার

14
এটি কি দৃ pers়তা অজ্ঞাব্য হতে হবে? এটি এমন নয় যে আপনি প্রতি দিন আপনার স্টোরেজ সিস্টেমটি পরিবর্তন করবেন।
ডেভিড 21

5
@ BrainSlugs83 - লিংক সার্ভারগুলিতে EF ব্যবহারের চেষ্টা করুন যা কেবলমাত্র ওপেনকুয়েরিকে সমর্থন করে - প্রচুর মজাদার। কখনও কখনও আপনার কাজটি সম্পূর্ণ করতে কাঁচা এসকিউএল প্রয়োজন। পরীক্ষার জন্য আপনি সর্বদা কোডকে বিচ্ছিন্নকরণে আঁকতে পারবেন না। এটি একটি নিখুঁত বিশ্বের না।
ব্যারিপিকারটি

23

কোড:

ExampleEntity exampleEntity = dbcontext.ExampleEntities.Attach(new ExampleEntity { Id = 1 });
exampleEntity.ExampleProperty = "abc";
dbcontext.Entry<ExampleEntity>(exampleEntity).Property(ee => ee.ExampleProperty).IsModified = true;
dbcontext.Configuration.ValidateOnSaveEnabled = false;
dbcontext.SaveChanges();

ফলাফল টিএসকিউএল:

exec sp_executesql N'UPDATE [dbo].[ExampleEntities]
SET [ExampleProperty ] = @0
WHERE ([Id] = @1)
',N'@0 nvarchar(32),@1 bigint',@0='abc',@1=1

বিঃদ্রঃ:

"ইসমোডিফায়েড = ট্রু" লাইনটি প্রয়োজন কারণ আপনি যখন নতুন উদাহরণসেন্টিটি অবজেক্টটি তৈরি করেন (কেবলমাত্র আইডি সম্পত্তি জনবহুল দিয়ে থাকে) অন্য সমস্ত বৈশিষ্ট্যের ডিফল্ট মান থাকে (0, নাল, ইত্যাদি)। আপনি যদি একটি "ডিফল্ট মান" দিয়ে ডিবি আপডেট করতে চান, সত্তা কাঠামোর দ্বারা পরিবর্তনটি সনাক্ত করা যাবে না এবং তারপরে ডিবি আপডেট হবে না।

উদাহরণে:

exampleEntity.ExampleProperty = null;

"ইসমোডিফায়েড = সত্য" লাইনটি ছাড়া কাজ করবে না, কারণ সম্পত্তি উদাহরণস্বরূপ, ইতিমধ্যে শূন্য রয়েছে যখন আপনি খালি উদাহরণইন্টিটি অবজেক্ট তৈরি করেছেন, আপনাকে EF কে বলতে হবে যে এই কলামটি আপডেট করা আবশ্যক, এবং এটি এই লাইনের উদ্দেশ্য।


এটি নিখুঁত। আমি এটি পরীক্ষা করেছিলাম এবং এটি আমি যা চেয়েছিলাম ঠিক তেমনই। আমি পরিবর্তনগুলি EF অবকাঠামোতে যেতে চাই (এন্টিফ্রেমওয়ার্ক.ট্রিজার প্রকল্প ব্যবহার করে) তবে কেবলমাত্র প্রাথমিক কী থাকায় 1 টি কলাম পরিবর্তন করতে সক্ষম হতে চাই।
মাইকজ্যানসেন

11

যদি DataItemক্ষেত্রগুলি EF প্রাক-বৈধ করে তুলবে (অযোগ্য ক্ষেত্রের মতো), আমাদের এই প্রসঙ্গে এই বৈধতাটি অক্ষম করতে হবে:

DataItem itemToUpdate = new DataItem { Id = id, Itemstatus = newStatus };
dataEntity.Entry(itemToUpdate).Property(x => x.Itemstatus).IsModified = true;
dataEntity.Configuration.ValidateOnSaveEnabled = false;
dataEntity.SaveChanges();
//dataEntity.Configuration.ValidateOnSaveEnabled = true;

অন্যথায় আমরা প্রাক-বৈধতা সন্তুষ্ট করার চেষ্টা করতে পারি এবং এখনও কেবলমাত্র একক কলাম আপডেট করতে পারি:

DataItem itemToUpdate = new DataItem
{
    Id = id,
    Itemstatus = newStatus,
    NonNullableColumn = "this value is disregarded - the db original will remain"
};
dataEntity.Entry(itemToUpdate).Property(x => x.Itemstatus).IsModified = true;
dataEntity.SaveChanges();

ধরে নেওয়া dataEntityহয় কSystem.Data.Entity.DbContext

আপনি এটিকে যুক্ত করে উত্পন্ন উত্সটি যাচাই করতে পারবেন DbContext:

/*dataEntity.*/Database.Log = m => System.Diagnostics.Debug.Write(m);

2

মাইক্রোসফ্ট এর প্রারম্ভিক অংশ হিসাবে এই নিবন্ধটি সত্তা সম্পর্কিত রাজ্যগুলি এবং কীভাবে এটি করবেন তা ব্যাখ্যা করে:

যুক্ত / সত্তা ও সত্তা যুক্ত করুন

'প্রসঙ্গে একটি বিদ্যমান তবে পরিবর্তিত সত্তা সংযুক্ত করা হচ্ছে' বিভাগটি দেখুন

এখন আমি এই টিউটোরিয়ালগুলির বাকী অংশটি পড়তে চলেছি।


0

এটি ইএফ কোরটিতে কিছুটা আলাদা কাজ করে:

EF কোর এ করার জন্য একটি দ্রুততর উপায় হতে পারে, তবে নিম্নলিখিতগুলি একটি নির্বাচন না করেই আপডেট আপডেট নিশ্চিত করে (। নেট ফ্রেমওয়ার্ক ৪.6.২ এ EF কোর 2 এবং জেটের সাথে পরীক্ষিত):

নিশ্চিত করুন যে আপনার মডেলটিতে ইসরকিওয়ার্ড বৈশিষ্ট্য নেই

তারপরে নিম্নলিখিত টেমপ্লেটটি (VB.NET এ) ব্যবহার করুন:

    Using dbContext = new MyContext()
        Dim bewegung = dbContext.MyTable.Attach(New MyTable())
        bewegung.Entity.myKey = someKey
        bewegung.Entity.myOtherField = "1"

        dbContext.Entry(bewegung.Entity).State = EntityState.Modified
        dbContext.Update(bewegung.Entity)

        Dim BewegungenDescription = (From tp In dbContext.Model.GetEntityTypes() Where tp.ClrType.Name = "MyTable" Select tp).First()
        For Each p In (From prop In BewegungenDescription.GetProperties() Select prop)
            Dim pp = dbContext.Entry(bewegung.Entity).Property(p.Name)
            pp.IsModified = False
        Next
        dbContext.Entry(bewegung.Entity).Property(Function(row) row.myOtherField).IsModified = True
        dbContext.SaveChanges()
    End Using

-2

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

var items = dataEntity.Include("items").items;
// For each one you want to change:
items.First(item => item.id == theIdYouWant).itemstatus = newStatus;
// After all changes:
dataEntity.SaveChanges();

আপনি চান একটি আইটেম পুনরুদ্ধার একটি নতুন কোয়েরি উত্পন্ন করা উচিত নয়।


আকর্ষণীয় উত্তর, অন্য কেউ কি এটি নিশ্চিত করেছেন?
ইয়ান

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