সত্তা ফ্রেমওয়ার্ক: "স্টোর আপডেট, সন্নিবেশ করানো বা বিবৃতি মুছে ফেলা অপ্রত্যাশিত সংখ্যক সারিগুলিকে প্রভাবিত করেছে (0)" [বন্ধ]


324

আমি গ্রিড নিয়ন্ত্রণ পপুলেশন সত্ত্বেও ফ্রেমওয়ার্ক ব্যবহার করছি। কখনও কখনও আমি আপডেট করার সময় আমি নিম্নলিখিত ত্রুটি পাই:

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

আমি কীভাবে এটি পুনরুত্পাদন করতে পারি তা বুঝতে পারি না। তবে কীভাবে একসাথে আমি আপডেটগুলি করি তা নিয়ে এটির কিছু করার থাকতে পারে। কেউ কি এটি দেখেছেন বা ত্রুটি বার্তাটি কী বোঝায় তা কি কেউ জানেন?

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


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

সমস্যা আপনার DBContext জন্য ভুল scoping হতে পারে stackoverflow.com/questions/49154250/... (এই উদাহরণে ASPNET পরিচয় হয় কিন্তু কোনো প্রসঙ্গ জন্য প্রযোজ্য)
Simon_Weaver

এই ত্রুটির প্রসঙ্গ নির্বিশেষে যেখানেই প্রসঙ্গটি তাত্ক্ষণিকভাবে চলছে সেদিকেই ব্রেক ব্রেকপয়েন্ট স্থাপন করা ভাল ধারণা। আপনি কি ওয়েবপৃষ্ঠাটি লোড করার পরে এটি একবার ইনস্ট্যান্ট হওয়ার আশা করেছিলেন কিন্তু 5 বার ব্রেক ব্রেকপয়েন্টটি আঘাত করছে? তাহলে আপনার সম্ভবত রেসের অবস্থা রয়েছে। তাকান Request.Uriপ্রকৃত অনুরোধ URL টি দেখতে। আমার ক্ষেত্রে আমার কিছু ট্র্যাকিং যুক্তি ছিল যা আমার সাইটে মারছিল এবং অকারণে ডিবি থেকে প্রসঙ্গটি লোড করছিল (এবং মাঝে মাঝে এটি আপডেটও করা)। সুতরাং আমি যে সত্যিকারের পৃষ্ঠাটি ডিবাগ করছিলাম তা একটি বোকা ট্র্যাকিং কোড লজিক দ্বারা এর ডেটা stomped ছিল।
সাইমন_উইভার

দেখুন @ এইচটিএমএল.আন্টিফৌজরী টোকেন () দেখুন
বিকাশ শর্মা

উত্তর:


199

এটি আশাব্যঞ্জক সম্মতি বলে একটি বৈশিষ্ট্যের একটি পার্শ্ব প্রতিক্রিয়া।

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

এর পিছনে ধারণাটি হ'ল আপনি যে পরিবর্তনটি নিজের অ্যাপ্লিকেশনটির দ্বারা জানা ছিল না সেটিকে ওভাররাইট করে শেষ করবেন না - এটি মূলত আপনার সমস্ত আপডেটে। নেট দ্বারা আটকানো একটি সামান্য সুরক্ষা ব্যবস্থা measure

যদি এটি সামঞ্জস্যপূর্ণ হয় তবে প্রতিক্রিয়াগুলি এটি আপনার নিজস্ব যুক্তির মধ্যেই ঘটছে (EG: আপনি প্রকৃতপক্ষে নির্বাচিত এবং আপডেটের মধ্যে অন্য পদ্ধতিতে ডেটা নিজে আপডেট করছেন) তবে এটি দুটি অ্যাপ্লিকেশনের মধ্যে কেবল রেসের শর্ত হতে পারে।


34
এটি একটি একক-ব্যবহারকারী পরিবেশে ঘটছে (আমার ডেভ মেশিনে) সুতরাং আমি মনে করি না এটি কোনও রেসের শর্ত হতে পারে। আমি কোনও সত্তা ডেটাসোর্সের সাথে একটি কাস্টম গ্রিড নিয়ন্ত্রণের সাথে আবদ্ধ করছি তাই আমি দৃশ্যের পিছনে ঠিক কী ঘটছে তা নিশ্চিত নই, তবে আমার নিজস্ব কোনও অতিরিক্ত কোড নেই যা টেবিলগুলি সংশোধন করছে। এই একযোগে সেটিংস পরিবর্তন করার কোনও উপায় আছে কি?
strongopinions

3
আমি মনে করি আপনি নিজের সত্তা মডেলটিতে প্রতি কলাম ভিত্তিতে এটি করতে পারেন (এটি বৈশিষ্ট্য উইন্ডোতে রয়েছে) তবে জিনিসটি হ'ল কেবল ত্রুটিটি দেখে আপনাকে আটকাবে এবং এটি এখনও কোনও আপডেট করবে না। আপনি কি আপনার ডাটাবেসে এসকিউএল কমান্ডগুলি দেখতে সক্ষম (EG: MSSQL এর জন্য এসকিউএল সার্ভার প্রোফাইলার)? আপনি কীভাবে আপডেটটি তৈরি করেছেন তা আপনি দেখতে পেলেন এবং কেন সেই আপডেটটি কোনও সারিকে প্রভাবিত করে না তা দেখতে সক্ষম হওয়া উচিত।
ফাইজাম

9
সত্তার যদি টাইমস্ট্যাম্পের সম্পত্তি থাকে তবে তা আপনার দৃষ্টিতে এটি সঞ্চিত আছে তা নিশ্চিত করুন এবং সত্তাটি টাইমস্ট্যাম্পটি সঠিকভাবে স্থাপন করেছে তা নিশ্চিত করুন।
anIBMer

আমার একটি টাইমস্ট্যাম্প কলাম ছিল এবং এটি আমি একবার সম্বোধন করার পরে, EF6.1 প্রত্যাশা অনুযায়ী কাজ করেছে, টিপটির জন্য ধন্যবাদ
@

3
আপনি যদি টাইমস্ট্যাম্প ব্যবহার করেন তবে tje অবজেক্টটি আপনি মুছে ফেলতে চান এটি সফলভাবে আপডেট করার জন্য পিকে সেট এবং রোভার্সন সম্পত্তি প্রয়োজন! আমি সংশ্লিষ্ট ডিবিসেটের সাথে বস্তুটি সংযুক্ত করার পরে আমি সারি ভার্সন (টাইমস্ট্যাম্প) বৈশিষ্ট্যটি নির্ধারণ করছিলাম, সে কারণেই এটি কার্যকর হয়নি। ভাল করেছ!
কিংবদন্তি

394

আমি এটিতে ছুটে এসেছি এবং এটি সত্তার আইডি (কী) ফিল্ডটি সেট না করার কারণে হয়েছিল। সুতরাং প্রসঙ্গটি ডেটা সংরক্ষণ করতে গিয়ে, এটি একটি আইডি = 0 খুঁজে পেল না your আপনার আপডেটের বিবৃতিতে একটি ব্রেক পয়েন্ট রাখতে ভুলবেন না এবং সত্তার আইডি সেট করা হয়েছে কিনা তা যাচাই করে নিন।

পল বেলোরার মন্তব্য থেকে

আমার .cshtml সম্পাদনা পৃষ্ঠায় লুকানো আইডি ইনপুট অন্তর্ভুক্ত করতে ভুলে গিয়ে এই সঠিক সমস্যাটি হয়েছিল


3
+1 আমার একই সমস্যা ছিল এবং এটি সমাধান খুঁজে পেতে সহায়তা করে। দেখা যাচ্ছে যে আমার অর্ডার মডেলটিতে আমার কাছে [বাঁধুন (বাদ দিন = "অর্ডারআইডি")] ছিল যা এইচটিপিপোস্টে সত্তার আইডির মান শূন্যের কারণ হতে পারে।
ধাস্ট

2
ঠিক এটাই আমি মিস করছি। আমার অবজেক্টের আইডি 0 ছিল
আজহার খোরাসানী

4
@ এইচটিএমএল.হিডেনফোর্ড (মডেল => মডেল.প্রডাক্টআইডি) - নিখুঁতভাবে কাজ করেছে। আমি সম্পাদনা পৃষ্ঠাতে (এমভিসি রেজার) প্রোডাক্টটি মিস করছি
রবি রাম

2
আমার একই রকম সমস্যা ছিল তবে একটি মোচড় দিয়ে। আমার জন্য সমস্যাটি ছিল আমার স্কেল টেবিলটি সঠিকভাবে সেটআপ করা হয়নি। আমার প্রাথমিক কী ক্ষেত্রটি স্বতঃবৃদ্ধিতে সেট করা হয়নি। সুতরাং ইএফ রেকর্ডটি প্রেরণ করবে আমি ডাব্লু / ওএ কী সন্নিবেশ করানোর চেষ্টা করছিলাম যা ঠিক আছে যদি আপনি বর্গক্ষেত্রটি বলতে ভুলে যান যে ক্ষেত্রটি একটি স্বয়ংবৃদ্ধি সনাক্তকরণ ক্ষেত্র, যা আমি ভুলে গিয়েছিলাম: <
আগিলে নুব

1
একই সমস্যা তবে একটি যৌগিক কী ব্যবহার করা হচ্ছে। মূল মানগুলির মধ্যে একটি সেট করা হয়নি।
ওবায়লিস

113

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

দীর্ঘ গল্প সংক্ষিপ্ত, আপনি যদি কোনও নতুন অবজেক্ট তৈরি করেন এবং EF কে জানান যে এটির ব্যবহার করে এটির সংশোধন করা হয়েছে EntityState.Modifiedতবে এটি এই ত্রুটিটি ফেলে দেবে কারণ এটি ডাটাবেসে এখনও বিদ্যমান নেই। আমার কোডটি এখানে:

MyObject foo = new MyObject()
{
    someAttribute = someValue
};

context.Entry(foo).State = EntityState.Modified;
context.SaveChanges();

হ্যাঁ, এটি মূর্খ বলে মনে হচ্ছে তবে এটি উত্থাপিত হয়েছিল কারণ প্রশ্নটিতে যে পদ্ধতিটি আগে ব্যবহার করা হত fooএটি আগে তৈরি হয়েছিল, এখন এটি কেবল এটির কাছে someValueচলে গিয়েছে এবং fooনিজেকে তৈরি করে।

সহজ ফিক্স, কেবল পরিবর্তন EntityState.Modifiedকরুন EntityState.Addedবা পুরো লাইনটি এতে পরিবর্তন করুন:

context.MyObject.Add(foo);

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

23

আমি এই একই ভীতিজনক ত্রুটির মুখোমুখি হয়েছি ... :) তখন আমি বুঝতে পারি যে আমি একটি সেট করতে ভুলে যাচ্ছি

@Html.HiddenFor(model => model.UserProfile.UserId)

প্রাথমিক কী আপডেট করার জন্য! আমি এই সহজ, কিন্তু খুব গুরুত্বপূর্ণ জিনিস ভুলে ঝোঁক!

যাইহোক: HiddenForএটিএসপি নেট নেট এমভিসির জন্য।


3
এটি সুরক্ষা ত্রুটির মতো মনে UserIdহয়, ফর্মটি সঞ্চয় করতে , হ্যাকারদের কাছে খুব ঝুঁকিপূর্ণ ... এটি পরে HttpContext.Current.User.Identity.Name
পপুলেশন করা

@ সার্জসাগান আপনি ঠিক বলেছেন ... তবে ইউজারআইডি এবং বর্তমান ব্যবহারকারীর নামটি নিশ্চিত করার জন্য আপনি যতক্ষণ না সার্ভার সাইডে কিছু চেক করেন ততক্ষণ আপনি যেতে ভাল।
লেনিয়েল ম্যাককাফেরি

1
আমার বক্তব্যটি হ'ল এমনকি যে কোনও উপায়ে আপনার HiddenForএটি সংগ্রহ করা দরকার কেন তা সংরক্ষণ করুন HttpContext... আমি এই সম্পত্তিটি ফর্মটিতে মোটেও রাখব না, যা আমাকে সর্বদা এটি সার্ভারের পাশ
কাটাতে

16

আপনি গ্রিডভিউতে "ডেটাকিনেমস" বৈশিষ্ট্যটি ভুলে গেছেন কিনা তা পরীক্ষা করে দেখুন। গ্রিডভিউয়ের মধ্যে ডেটা পরিবর্তন করার সময় এটি আবশ্যক

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.datakeynames.aspx


+1 টি। আমার জন্য নিখুঁত এবং সহজ সমাধান। আমি গ্রিডভিউকে সত্তাডাটা সোর্সকে বাধ্য করছি এবং এটি আমার প্রাথমিক কীতে অবজেক্টে সেট করি নি।
আন্দিজ

আমরা জানি যে কেন্দো ইউআই সম্মিলিত কী সমর্থন করে না, তবে আমি যদি নতুন কলাম যুক্ত করেছি যা আমার চাবিগুলি এক সাথে সম্পাদনা করে, তখন কী ঘটছে?
ব্রানিস্লাভ

15

দুটি কারণে যে কোনও একটি দ্বারা সমস্যাটি দেখা দিয়েছে: -

  1. এক বা একাধিক বৈশিষ্ট্য সহ আপনি একটি সারি আপডেট করার চেষ্টা করেছেন Concurrency Mode: Fixed.. এবং আশাবাদী কনকুরঞ্জি ডেটা সংরক্ষণে বাধা দেয়। অর্থাৎ। সার্ভার ডেটা পাওয়ার সময় এবং আপনি যখন সার্ভার ডেটা সংরক্ষণ করেছিলেন তখন কিছুর মধ্যে সারি ডেটা পরিবর্তন করা হয়েছিল।
  2. আপনি একটি সারি আপডেট বা মুছতে চেষ্টা করেছেন কিন্তু সারিটি বিদ্যমান নেই। কেউ পুনরুদ্ধারের মধ্যে ডেটা পরিবর্তন করার ক্ষেত্রে (এই ক্ষেত্রে, অপসারণ) এর অন্য একটি উদাহরণ তারপরে সংরক্ষণ করুন বা আপনি কোনও ক্ষেত্র আপডেট করার চেষ্টা করছেন যা কোনও পরিচয় নয় (যেমন StoreGeneratedPattern = Computed)) এবং সেই সারিটি বিদ্যমান নেই।

1
এটি বরাদ্দ করা হয়েছিল এমন সমস্ত বস্তুর বৈশিষ্ট্যগুলি যদি তাদের পূর্বের মতো একই মান সহ নির্ধারিত হয় তবে এটিও ঘটতে পারে।
সার্জ সাগান

দ্বিতীয়টির জন্য +1 আমার স্টোরজেনারেটেড প্যাটার্ন = ছিল না, স্টোরজেনারেটেড প্যাটার্নে = আইডেন্টিটি সমস্যাটি সমাধান করেছে। ধন্যবাদ
tkt986

12

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

সমাধানটি Dateোকানোর আগে ডেটটাইম থেকে এখন মিলিসেকেন্ডগুলি ছাঁটাই করা ছিল।


2
আমরা মান Dateসহ একটি কলামে DateTime
wereোকানো

1
একই অবস্থা. আমাদের কাছে ডেটা গুদাম রেকর্ড ছিল এবং কী অংশ হিসাবে টাইমস্ট্যাম্প ব্যবহার করছিলাম। ডেটা গুদামে টাইমস্ট্যাম্পটি একটি এসকিউএল ডেটটাইম ছিল, তবে সি # তে টাইমস্ট্যাম্পটি মেলেনি। আমি এসকিউএল ডেটা টাইপকে ডেটটাইম 2 (7) এ পরিবর্তন করেছি, ইএফ মডেলটি আপডেট করেছি এবং সব ঠিক হয়ে গেছে।
এমএমসিফ্লাই

ডেটটাইম 2 (7) এ কলামটি পরিবর্তন করা আমার পক্ষেও কাজ করেছিল। ধন্যবাদ @ এমএমসিফ্লাই
ডেজেমস

10

আমার একই সমস্যা ছিল এবং @ ওয়েবট্রিফিউশন এর উত্তর সমাধান খুঁজে পেতে সহায়তা করেছে।

আমার মডেল Bind(Exclude)সত্তার আইডিতে বৈশিষ্ট্যটি ব্যবহার করছিল যা এইচটিপিপোস্টে সত্তার আইডির মান শূন্য হতে পারে।

namespace OrderUp.Models
{
[Bind(Exclude = "OrderID")]
public class Order
{
    [ScaffoldColumn(false)]
    public int OrderID { get; set; }

    [ScaffoldColumn(false)]
    public System.DateTime OrderDate { get; set; }

    [Required(ErrorMessage = "Name is required")]
    public string Username { get; set; }
    }
}   

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

10

আমারও একই সমস্যা ছিল, আমি বুঝতে পারি যে এটি রোভার্শনটির কারণে হয়েছিল যা শূন্য ছিল। পরীক্ষা করে দেখুন যে আপনার আইডি এবং আপনার RowVersion হয় নাল না

আরও তথ্যের জন্য এই টিউটোরিয়াল পড়ুন

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application


সারি সংস্করণটি আমার ক্ষেত্রে শূন্য ছিল
প্রকাশ

আমার ক্ষেত্রে আমি দুর্ঘটনাক্রমে আমার [বাইন্ড (অন্তর্ভুক্ত = বৈশিষ্ট্যগুলি)] তে আইডি ক্ষেত্রটি সরিয়েছি। এটি আবার যুক্ত করুন এবং এটি দুর্দান্ত কাজ করেছে।
কেভারম্যান

8

মডেল-ফার্স্ট থেকে কোড-ফার্স্টে পরিবর্তনের পরে আমি এই ত্রুটি পেতে শুরু করেছি। আমার কাছে একাধিক থ্রেড রয়েছে যা একটি ডেটাবেস আপডেট করে যেখানে কিছু একই সারি আপডেট করতে পারে। আমি জানি না কেন মডেল-ফার্স্ট ব্যবহার করতে আমার কেন সমস্যা হল না, ধরে নিন যে এটি একটি পৃথক সম্মতিযুক্ত ডিফল্ট ব্যবহার করে।

এটি সংঘটিত হওয়ার শর্তটি জেনে এক জায়গায় এটি পরিচালনা করতে, আমি আমার ডিবি কনটেক্সট ক্লাসে নিম্নলিখিত ওভারলোডটি যুক্ত করেছি:

using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;

public class MyDbContext: DbContext {
...
        public int SaveChanges(bool refreshOnConcurrencyException, RefreshMode refreshMode = RefreshMode.ClientWins) {
            try {
                return SaveChanges();
            }
            catch (DbUpdateConcurrencyException ex) {
                foreach (DbEntityEntry entry in ex.Entries) {
                    if (refreshMode == RefreshMode.ClientWins)
                        entry.OriginalValues.SetValues(entry.GetDatabaseValues());
                    else
                        entry.Reload();
                }
                return SaveChanges();
            }
        }
}

তারপরে SaveChanges(true)যেখানে প্রযোজ্য সেখানে ডেকে আনা হয়েছে ।


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

আমিও সাহায্য করেছে, আরো options- ধরে এই বর্ণন stackoverflow.com/a/13891724/4836581
Zvi Redler

7

আপনাকে প্রাথমিক কীটির একটি বাউন্ডফিল্ড স্পষ্টভাবে অন্তর্ভুক্ত করতে হবে। আপনি যদি ব্যবহারকারীটি প্রাথমিক কীটি দেখতে না চান তবে আপনাকে এটি CSS এর মাধ্যমে লুকিয়ে রাখতে হবে:

    <asp:BoundField DataField="Id_primary_key" ItemStyle-CssClass="hidden" 
HeaderStyle-CssClass="hidden" />

যেখানে 'আড়াল' সিএসএসের এমন একটি শ্রেণি যেখানে এটি 'কিছুই নয়' তে প্রদর্শিত হয়েছে।


1
হ্যাঁ, আপনি আমাকে এই বিষয়টি আটকে রেখেছিলেন যে আমি আমার লুকানো আইডি ফিল্ডটি এএসপি.নেট এমভিসিতে মুছে ফেলেছি। ধন্যবাদ @ পাওলো! :)
টমাসজ ইনিউইচিজ

7

সম্পাদনার সময় সত্ত্বার আইডি বা প্রাথমিক কীটি ভিউতে একটি লুকানো ক্ষেত্র হিসাবে অন্তর্ভুক্ত থাকে

অর্থাত

      @Html.HiddenFor(m => m.Id)

যে সমস্যা সমাধান করে।

এছাড়াও যদি আপনার মডেলটিতে অব্যবহৃত আইটেম অন্তর্ভুক্ত থাকে তবে এটিও অন্তর্ভুক্ত থাকে এবং এটি নিয়ামককে পোস্ট করে


7

আমিও এই ত্রুটিটি পেরিয়ে এসেছি। যে সমস্যাটি পরিণত হয়েছিল সেটি সেই টেবিলে একটি ট্রিগার দ্বারা বাঁচানোর চেষ্টা করছিলাম। ট্রিগারটি 'INSTEAD OF INSERT' ব্যবহার করেছে যার অর্থ 0 টি সারি কখনই সেই টেবিলটিতে প্রবেশ করানো হয়েছে, তাই ত্রুটি। ভাগ্যক্রমে ট্রিগার কার্যকারিতাটি ভুল হতে পারে তবে আমি মনে করি এটি কোনও বৈধ ক্রিয়াকলাপ হতে পারে যা কোনওভাবে কোডের মধ্যে পরিচালনা করা উচিত। আশা করি এটি একদিন কাউকে সাহায্য করবে।


2
সত্তাকে এই বিশ্বাস করে চালিত করা যেতে পারে যে ট্রিগার থেকে একটি SELECT বিবৃতি (প্রাথমিক কী কলাম সহ) ফেরত দিয়ে সারি যুক্ত করা হয়েছিল।
jahu

1
@ জহুর মন্তব্যে প্রসারিত করতে, আমার ট্রিগার থেকে নতুন সন্নিবেশ করা আইটেমটির সত্যিকারের আইডি পেতে হয়েছিল এবং কলামের নামটি ট্রিগার টেবিলের পরিচয় কলামের সাথে মিলিয়ে যেতে হবে (আমার ক্ষেত্রে, আসলে একটি দৃশ্য তাই এটি হয়নি) এর নিজস্ব কোনও পরিচয় নেই তবে আমি এটিএমএসকে বিশ্বাস করে ছদ্মবেশী করেছিলাম)। আমার SELECT SCOPE_IDENTITY() as MyViewId
ট্রিগারটি

এই প্রশ্নটিও দেখুন: স্ট্যাকওভারফ্লো
.com/

আমার ক্ষেত্রে আমি একটি শিশু সংগ্রহের সত্তাগুলিতে মুছুন অপারেশন করছিলাম তবে চাইল্ড সত্তাগুলির মধ্যে একটির জন্য মুছে ফেলার ট্রিগার ছিল যার কারণে অন্য একটি শিশু সত্তা মুছে ফেলা হয়েছিল। এটি ত্রুটি সৃষ্টি করেছিল যেহেতু সত্ত্বেও কাঠামো মুছে ফেলার চেষ্টা করার আগে এন - 1 টি সারিগুলি শিশু সত্তা মুছে ফেলার কারণে ট্রিগারটির কারণে প্রভাবিত হয়েছিল।
skeletank

6

আমি এই ইস্যুটি একটি টেবিলে এসে পৌঁছলাম যা একটি প্রাথমিক কী অনুপস্থিত ছিল এবং তার একটি ডেটটাইম (2, 3) কলাম ছিল (সুতরাং সত্তার "প্রাথমিক কী" সমস্ত কলামের সংমিশ্রণ ছিল) ... সারণিটি সম্পাদন করার সময় টাইমস্ট্যাম্পটি ছিল আরও সুনির্দিষ্ট সময় (2018-03-20 08: 29: 51.8319154) যা কেটে গেছে (2018-03-20 08: 29: 51.832) যাতে মূল ক্ষেত্রগুলির অনুসন্ধান ব্যর্থ হয়।


5

আমারও এই ত্রুটি ছিল কিছু পরিস্থিতি রয়েছে যেখানে সত্তা আপনি ব্যবহার করছেন এমন প্রকৃত ডেটাবেস প্রসঙ্গটি সম্পর্কে সচেতন না হতে পারে বা মডেলটি আলাদা হতে পারে। এর জন্য, সেট করুন: সত্তা স্টেট.মোডিফায়েড; এন্টিস্টেটে যোগ করুন ded

এটা করতে:

if (ModelState.IsValid)
{
context.Entry(yourModelReference).State = EntityState.Added;
context.SaveChanges();
}

এটি সুনির্দিষ্ট করবে যে সত্তাটি আপনি যে রাজ্যের সাথে কাজ করছেন বা যুক্ত করছেন তা জানেন knows এই মুহুর্তে সমস্ত সঠিক মডেল মান সেট করা দরকার। পটভূমিতে যে কোনও পরিবর্তন করা হতে পারে তা looseিলা না করার বিষয়ে যত্নবান।

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


1
আপনি একজন গুরু! এটি আমার জন্য কাজ!
হার্নাল্ডো গঞ্জালেজ

5
  @Html.HiddenFor(model => model.RowVersion)

আমার রোভার্সনটি নাল ছিল, সুতরাং আমার সমস্যা সমাধানের দৃশ্যে এটি যুক্ত করতে হয়েছিল


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

5

[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None)]আমার ক্ষেত্রে লাইনটি কৌশলটি করেছে:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;


[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int? SomeNumber { get; set; }

4

কেবলমাত্র টেবিলটি তৈরি করুন এবং ফর্ম উভয়ই প্রাথমিক কী এবং এডএমএক্স আপডেট হয়েছে।

আমি দেখতে পেয়েছি যে আপডেটের সময় কোনও ত্রুটি সাধারণত এর কারণে ঘটেছিল: - সারণীতে কোনও প্রাথমিক কী নেই - সম্পাদনা দর্শন / ফর্মটিতে কোনও প্রাথমিক কী নেই (যেমন @Html.HiddenFor(m=>m.Id)


4

আমারও একই সমস্যা ছিল। আমার ক্ষেত্রে আমি প্রাথমিক কী আপডেট করার চেষ্টা করছিলাম, যা অনুমোদিত নয়।


4

একটি ব্যবহার করার সময় আমি এই ত্রুটিটি বিক্ষিপ্তভাবে পেয়েছি async পদ্ধতি । যেহেতু আমি একটি সিঙ্ক্রোনাস পদ্ধতিতে স্যুইচ করেছি তাই ঘটেনি।

ত্রুটিযুক্তভাবে ত্রুটিগুলি:

[Authorize(Roles = "Admin")]
[HttpDelete]
[Route("file/{id}/{customerId}/")]
public async Task<IHttpActionResult> Delete(int id, int customerId)
{
    var file = new Models.File() { Id = id, CustomerId = customerId };
    db.Files.Attach(file);
    db.Files.Remove(file);

    await db.SaveChangesAsync();

    return Ok();
}

সারাক্ষণ কাজ করে:

[Authorize(Roles = "Admin")]
[HttpDelete]
[Route("file/{id}/{customerId}/")]
public IHttpActionResult Delete(int id, int customerId)
{
    var file = new Models.File() { Id = id, CustomerId = customerId };
    db.Files.Attach(file);
    db.Files.Remove(file);

    db.SaveChanges();

    return Ok();
}

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

3

আমি ত্রুটিটি পেয়েছি যখন আমি ডিবিতে কিছু সারি মুছে ফেলছিলাম (লুপে) এবং একই টেবিলে নতুনগুলি যুক্ত করছি।

আমার জন্য সমাধানগুলি ছিল, গতিময়ভাবে প্রতিটি লুপের পুনরাবৃত্তিতে একটি নতুন প্রসঙ্গ তৈরি করা


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

3
    public void Save(object entity)
    {
        using (var transaction = Connection.BeginTransaction())
        {
        try
                {
                    SaveChanges();
                    transaction.Commit();
                }
                catch (OptimisticConcurrencyException)
                {
                    if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Deleted || ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Modified)
                        this.Refresh(RefreshMode.StoreWins, entity);
                    else if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Added)
                        Detach(entity);
                    AcceptAllChanges(); 
                    transaction.Commit();
                }
        }
    }

আপনি কি দয়া করে পরিষ্কার করতে পারেন যে এখানে 'এটি' উল্লেখ করছে এবং অবজেক্টস্টেট ম্যানেজারটি কী? আমি এটি আমাদের বেস সংগ্রহস্থল শ্রেণিতে চেষ্টা করছি তবে ত্রুটিগুলি পাচ্ছি
নাওমি

3

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

অথবা

এটিও ঘটতে পারে যদি বরাদ্দ করা সমস্ত অবজেক্ট বৈশিষ্ট্য, তাদের আগের মতো একই মান দেওয়া হত।

        using(var db = new MyContext())
        {
            var address = db.Addresses.FirstOrDefault(x => x.Id == Id);

            address.StreetAddress = StreetAddress; // if you are assigning   
            address.City = City;                   // all of the same values
            address.State = State;                 // as they are
            address.ZipCode = ZipCode;             // in the database    

            db.SaveChanges();           // Then this will throw that exception
        }

2

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


2

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

context.Users.Attach(orderer);

সঙ্গে

if (orderer.Id > 0) {
    context.Users.Attach(orderer);
}

2

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


2

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

এক্সপ্রেস প্রোফাইলার

এসকিএল প্রোফাইলার ব্যবহার করে আপনি ইবি দ্বারা ডিবিতে যা কিছু প্রেরণ করা হচ্ছে তাতে অ্যাক্সেস পেতে পারেন। আমার ক্ষেত্রে এটির পরিমাণ ছিল:

exec sp_executesql N'UPDATE [dbo].[Category]
SET [ParentID] = @0, [1048] = NULL, [1033] = @1, [MemberID] = @2, [AddedOn] = @3
WHERE ([CategoryID] = @4)
',N'@0 uniqueidentifier,@1 nvarchar(50),@2 uniqueidentifier,@3 datetime2(7),@4 uniqueidentifier',
@0='E060F2CA-433A-46A7-86BD-80CD165F5023',@1=N'I-Like-Noodles-Do-You',@2='EEDF2C83-2123-4B1C-BF8D-BE2D2FA26D09',
@3='2014-01-29 15:30:27.0435565',@4='3410FD1E-1C76-4D71-B08E-73849838F778'
go

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

আমার ক্ষেত্রে সমস্যাটি ক্যাটাগরিআইডি দ্বারা সৃষ্ট হয়েছিল।

ডেটাবেসে EF প্রেরিত আইডি দ্বারা কোনও শ্রেণিবদ্ধ পরিচয় পাওয়া যায় নি তাই 0 রেকর্ড ক্ষতিগ্রস্থ হচ্ছে।

এটি যদিও ইএফের দোষ ছিল না, বরং একটি বগি নাল কোলেসিং "??" এমন একটি ভিউ কন্ট্রোলারে বিবৃতি দেওয়া হবে যা ডেটা স্তরে বোকা পাঠাচ্ছিল।


2

উপরের উত্তরগুলির মধ্যে কোনওটিই আমার পরিস্থিতি এবং এর সমাধানটি বেশ কভার করে না।

এমভিসি 5 নিয়ামকটিতে ত্রুটিটি ফেলে দেওয়া কোড:

        if (ModelState.IsValid)
        {
            db.Entry(object).State = EntityState.Modified; 
            db.SaveChanges(); // line that threw exception
            return RedirectToAction("Index");
        }

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

আপনি এ দ্বারা এটি সমাধান করতে পারেন) অবজেক্ট যুক্ত করার জন্য সেভ কলটি সংশোধন করুন, বা খ) সম্পাদনার প্রাথমিক কী পরিবর্তন করবেন না। আমি খ)।


2

যখন স্বীকৃত উত্তরটি বলেছিল " এটি আপনার অ্যাপ্লিকেশনটি জানেনি যে এমন পরিবর্তনটি ওভাররাইট করা শেষ হবে না ", তখন আমার সন্দেহ ছিল কারণ আমার বস্তুটি নতুনভাবে তৈরি হয়েছিল। তবে তারপরে দেখা যাচ্ছে, সেখানে একটি ছিলINSTEAD OF UPDATE, INSERT- TRIGGER টেবিলের সাথে সংযুক্তি ছিল যা একই টেবিলের গণনা করা কলাম আপডেট করে।

একবার আমি AFTER INSERT, UPDATEএটিকে পরিবর্তন করি , এটি ঠিকঠাক কাজ করছিল।


2

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

[Key, Column(Order = 2)]  
public DateTime PurchasedDate { get; set; } = (DateTime)SqlDateTime.MinValue;

উত্পন্ন কলামটি একটি ডেটটাইম কলাম। SaveChanges কল করার সময়, EF নিম্নলিখিত এসকিউএল উত্পন্ন করেছে:

-- Region Parameters
DECLARE @0 Int = 2
DECLARE @1 Int = 25
DECLARE @2 Int = 141051
DECLARE @3 DateTime2 = '2017-07-27 15:16:09.2630000' --(will not equal a datetime value)
-- EndRegion
UPDATE [dbo].[OrganizationSurvey]
SET [OrganizationSurveyStatusId] = @0
WHERE ((([SurveyID] = @1) AND ([OrganizationID] = @2)) AND ([PurchasedDate] = @3))

যেহেতু এটি একটি ডেটটাইম কলামটি ডেটটাইম 2 মানের সাথে মেলানোর চেষ্টা করছিল, এটি কোনও ফল দেয়নি। একমাত্র সমাধানটি আমি ভাবতে পারি যে কলামটি ডেটটাইম 2 এ পরিবর্তন করা হয়েছিল:

[Key, Column(Order = 2, TypeName = "DateTime2")]  
public DateTime PurchasedDate { get; set; } = (DateTime)SqlDateTime.MinValue;

1
এটা বনাম কাজ কাজ করছে না এর strangeness অন্তর্নিহিত বিন্যাস / বেস কি আছে datetimeবনাম datetime2। মূলত কিছু মিলিসেকেন্ড মান কোনও মিলের জন্য মূল্যায়ন করবে, অন্যরা তা করবে না। আমার সাথেও একই ঘটনা ঘটেছিল এবং আমিও স্যুইচ করেছিলাম DateTime2
xr280xr

+1 আমি আশা করি আপনার জন্য আমি এটিতে +100 করতে পারি। আমি অনেক জায়গাগুলি ঘুরে দেখার পরে অবশেষে এটি পেয়েছি এবং বুঝতে পেরেছিলাম যে, আমার প্রাথমিক কী হিসাবে আমার ডেটটাইম ছিল। হ্যাঁ, এটি প্রকৃতপক্ষে এটি স্থির করেছে। আমি কলামটি ডেটটাইম 2 এ আপডেট করেছি এবং এটি কার্যকর হয়েছে। এখন, আমার গরুর মাংস এর জন্য এমন একটি কৃপণ প্রশ্নটি তৈরি করার জন্য অ্যান্টিটি ফ্রেমওয়ার্কের সাথে রয়েছে যা আমাকে এটি করতে বাধ্য করে।
ক্যাচপপস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.