c# - যবহ - রিলেশনাল ডাটাবেজ কি
এনটাইটেল ফ্রেমওয়ার্ক ব্যবহার করে SQL সার্ভার ডেটাবেসে পরিবর্তনগুলি সংরক্ষণ করার সময় এক বা একাধিক সংস্থার জন্য যাচাইকরণ ব্যর্থ হয়েছে (12)
আমি আমার সম্পাদনা ডেটাবেসে সংরক্ষণ করতে চাই এবং আমি এন্টিআই ফ্রেমওয়ার্ক কোড ব্যবহার করছি - প্রথমে ASP.NET MVC 3 / C # এ কিন্তু ত্রুটিগুলি পেয়েছি। আমার ইভেন্ট ক্লাসে, আমার তারিখ এবং টাইমস্প্যান ডেটাপাইপ আছে তবে আমার ডাটাবেসে, আমি যথাক্রমে তারিখ এবং সময় পেয়েছি। এই কারণ হতে পারে? ডেটাবেসে পরিবর্তনগুলি সংরক্ষণ করার আগে আমি কোডটিতে উপযুক্ত ডেটাটাইপে কীভাবে ঢোকাতে পারি।
public class Event
{
public int EventId { get; set; }
public int CategoryId { get; set; }
public int PlaceId { get; set; }
public string Title { get; set; }
public decimal Price { get; set; }
public DateTime EventDate { get; set; }
public TimeSpan StartTime { get; set; }
public TimeSpan EndTime { get; set; }
public string Description { get; set; }
public string EventPlaceUrl { get; set; }
public Category Category { get; set; }
public Place Place { get; set; }
}
নিয়ামক পদ্ধতি >>>> দোকান DB.SaveChanges সমস্যা ();
// POST: /EventManager/Edit/386
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
var theEvent = storeDB.Events.Find(id);
if (TryUpdateModel(theEvent))
{
storeDB.SaveChanges();
return RedirectToAction("Index");
}
else
{
ViewBag.Categories = storeDB.Categories.OrderBy(g => g.Name).ToList();
ViewBag.Places = storeDB.Places.OrderBy(a => a.Name).ToList();
return View(theEvent);
}
}
সঙ্গে
public class EventCalendarEntities : DbContext
{
public DbSet<Event> Events { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Place> Places { get; set; }
}
এসকিউএল সার্ভার 2008 R2 ডাটাবেস / টি-এসকিউএল
EventDate (Datatype = date)
StartTime (Datatype = time)
EndTime (Datatype = time)
এইচটিপি ফর্ম
EventDate (Datatype = DateTime) e.g. 4/8/2011 12:00:00 AM
StartTime (Datatype = Timespan/time not sure) e.g. 08:30:00
EndTime (Datatype = Timespan/time not sure) e.g. 09:00:00
'/' আপ্লিকেশনে সারভার এরর
বৈধতা এক বা একাধিক সংস্থার জন্য ব্যর্থ হয়েছে। আরও তথ্যের জন্য 'Entity ValidationErrors' সম্পত্তিটি দেখুন।
বিবরণ: বর্তমান ওয়েব অনুরোধ কার্যকর করার সময় একটি অসংলগ্ন ব্যতিক্রম ঘটেছে। ত্রুটির সম্পর্কে আরও তথ্যের জন্য এবং যেখানে এটি কোডে উদ্ভূত হয়েছিল তার জন্য স্ট্যাক ট্রেসটি পর্যালোচনা করুন।
ব্যতিক্রম বিবরণ: System.Data.Entity.valalidation.DbEntity বৈধতা ব্যতিক্রম: এক বা একাধিক সংস্থার জন্য বৈধতা ব্যর্থ হয়েছে। আরও তথ্যের জন্য 'Entity ValidationErrors' সম্পত্তিটি দেখুন।
উৎস ত্রুটি:
Line 75: if (TryUpdateModel(theEvent))
Line 76: {
Line 77: storeDB.SaveChanges();
Line 78: return RedirectToAction("Index");
Line 79: }
উত্স ফাইল: C: \ sep \ MvcEventCalendar \ MvcEventCalendar \ কন্ট্রোলার \ EventManagerController.cs লাইন: 77
স্ট্যাক ট্রেস:
[DbEntity ValalidationException: বৈধতা এক বা একাধিক সংস্থার জন্য ব্যর্থ হয়েছে। বিস্তারিত জানার জন্য 'Entity ValidationErrors' সম্পত্তিটি দেখুন।]
আপনার উত্তর জন্য Thnaks, এটা আমাকে alot সাহায্য। আমি ভিবি.Net কোড হিসাবে, Vb.Net জন্য এই বোল্ট কোড
Try
Return MyBase.SaveChanges()
Catch dbEx As Validation.DbEntityValidationException
For Each [error] In From validationErrors In dbEx.EntityValidationErrors
From validationError In validationErrors.ValidationErrors
Select New With { .PropertyName = validationError.PropertyName,
.ErrorMessage = validationError.ErrorMessage,
.ClassFullName = validationErrors.Entry.Entity
.GetType().FullName}
Diagnostics.Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
[error].ClassFullName,
[error].PropertyName,
[error].ErrorMessage)
Next
Throw
End Try
আপনি নিম্নলিখিত কোডটি দিয়ে DbEntityValidationException
থেকে সমস্ত তথ্য বের করতে পারেন (আপনাকে নামস্থানগুলি যোগ করতে হবে: System.Data.Entity.Validation
এবং System.Diagnostics
আপনার using
তালিকাতে):
catch (DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
Trace.TraceInformation("Property: {0} Error: {1}",
validationError.PropertyName,
validationError.ErrorMessage);
}
}
}
আমি OnSaveChanges নিবন্ধিত ব্যতিক্রমগুলি পছন্দ করি না এবং এটি আছে
var validationErrors = model.GetValidationErrors();
var h = validationErrors.SelectMany(x => x.ValidationErrors
.Select(f => "Entity: "
+(x.Entry.Entity)
+ " : " + f.PropertyName
+ "->" + f.ErrorMessage));
আমি আজ এই ত্রুটিটি পাচ্ছিলাম এবং কিছুক্ষণের জন্য এটি কাজ করতে পারিনি, কিন্তু আমি বুঝতে পেরেছিলাম যে এটি আমার মডেলগুলিতে কিছু প্রয়োজনীয় RequireAttribute
যুক্ত করার পরে এবং কিছু বিকাশ বীজ তথ্য সমস্ত প্রয়োজনীয় ক্ষেত্রগুলি জনবহুল করে না।
সুতরাং শুধু একটি নোট যে যদি আপনি DropCreateDatabaseIfModelChanges
মতো কিছু ধরণের DropCreateDatabaseIfModelChanges
কৌশল মাধ্যমে ডেটাবেস আপডেট করার সময় এই ত্রুটিটি পেয়ে DropCreateDatabaseIfModelChanges
তবে আপনার বীজ তথ্যটি পূরণ করে এবং কোনও মডেল ডেটা যাচাইকরণ গুণাবলী পূরণ করে তা নিশ্চিত করতে হবে।
আমি জানি এই সমস্যাটির মধ্যে এটি সামান্য আলাদা, কিন্তু এটি একটি জনপ্রিয় প্রশ্ন, তাই আমি মনে করি অন্যদের মতো একই সমস্যা নিয়ে আমি উত্তর দেওয়ার জন্য আরও কিছু যোগ করব।
এই অন্যদের সাহায্য করে :)
এই কোডটি আমার সমস্যাটি খুঁজে পেতে সাহায্য করেছিল যখন আমার Entity Vlidation Erros এর সাথে সমস্যা হয়েছিল। এটা আমার Entity সংজ্ঞা সঙ্গে সঠিক সমস্যা আমাকে বলা। StoreDB.SaveChanges (); নিম্নলিখিত ব্লক ধরা চেষ্টা করুন।
try
{
if (TryUpdateModel(theEvent))
{
storeDB.SaveChanges();
return RedirectToAction("Index");
}
}
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
Exception raise = dbEx;
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
string message = string.Format("{0}:{1}",
validationErrors.Entry.Entity.ToString(),
validationError.ErrorMessage);
// raise a new exception nesting
// the current instance as InnerException
raise = new InvalidOperationException(message, raise);
}
}
throw raise;
}
এই ক্ষেত্রে আপনার একই সম্পত্তি নাম দিয়ে ক্লাস আছে, এখানে প্রভিনের উত্তরটির একটি ছোট এক্সটেনশন রয়েছে:
catch (DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
Trace.TraceInformation(
"Class: {0}, Property: {1}, Error: {2}",
validationErrors.Entry.Entity.GetType().FullName,
validationError.PropertyName,
validationError.ErrorMessage);
}
}
}
এখানে টনি এর এক্সটেনশান একটি এক্সটেনশান ... :-)
এনটাইটেল ফ্রেমওয়ার্ক 4.x এর জন্য, যদি আপনি কী ক্ষেত্রের নাম এবং মানটি পেতে চান তবে আপনি কোনটি সত্তা উদাহরণ (ডিবি রেকর্ড) সমস্যাটি জানেন তা আপনি নিম্নলিখিতটি যোগ করতে পারেন। এটি আপনার DbContext অবজেক্ট থেকে আরো শক্তিশালী অবজেক্ট কনটেক্সট ক্লাস সদস্যদের অ্যাক্সেস সরবরাহ করে।
// Get the key field name & value.
// This assumes your DbContext object is "_context", and that it is a single part key.
var e = ((IObjectContextAdapter)_context).ObjectContext.ObjectStateManager.GetObjectStateEntry(validationErrors.Entry.Entity);
string key = e.EntityKey.EntityKeyValues[0].Key;
string val = e.EntityKey.EntityKeyValues[0].Value;
এটি একটি নির্দিষ্ট কলামের জন্য অনুমোদিত অক্ষরগুলির সর্বাধিক সংখ্যক কারণে হতে পারে, যেমন SQL তে একটি ক্ষেত্রের মধ্যে নিম্নলিখিত ডাটা টাইপ nvarchar(5)
থাকতে পারে তবে ব্যবহারকারীর থেকে প্রবেশ করা অক্ষরের সংখ্যাটি নির্দিষ্টের চেয়ে বেশি, তাই ত্রুটি ঘটে।
ডাটাবেস হালনাগাদ করার কয়েক দিন আগে আমি একই সমস্যা মোকাবেলা করেছি। আমার ক্ষেত্রে, রক্ষণাবেক্ষণের জন্য কয়েকটি নন-নুলেবল কলাম যোগ করা হয়েছিল যা কোডটি সরবরাহ করে না যা ব্যতিক্রমটি ঘটছে। আমি যারা ক্ষেত্র খুঁজে বের করে এবং তাদের জন্য মান সরবরাহ এবং তার সমাধান।
নিশ্চিত করুন যে যদি আপনার ডিবি সারিতে nvarchar (50) থাকে তবে আপনি এতে 50 টিরও বেশি অক্ষর অন্তর্ভুক্ত করতে চেষ্টা করবেন না। মূঢ় ভুল কিন্তু এটি খুঁজে বের করতে আমাকে 3 ঘন্টা সময় লেগেছে।
বিস্তারিত টেক্সট সঙ্গে ব্যতিক্রম এই বাস্তবায়ন মোড়ানো সত্তা ব্যতিক্রম। এটি DbEntityValidationException
, DbEntityValidationException
, DbUpdateException
পরিসীমা ত্রুটি (এমএস এসকিউএল) পরিচালনা করে এবং বার্তাটিতে অবৈধ সত্তা এর কী অন্তর্ভুক্ত করে (দরকারী যখন একটি SaveChanges
কল এ অনেকগুলি সংস্থাগুলিকে SaveChanges
)।
প্রথমে, DbContext ক্লাসে SaveChanges ওভাররাইড করুন:
public class AppDbContext : DbContext
{
public override int SaveChanges()
{
try
{
return base.SaveChanges();
}
catch (DbEntityValidationException dbEntityValidationException)
{
throw ExceptionHelper.CreateFromEntityValidation(dbEntityValidationException);
}
catch (DbUpdateException dbUpdateException)
{
throw ExceptionHelper.CreateFromDbUpdateException(dbUpdateException);
}
}
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken)
{
try
{
return await base.SaveChangesAsync(cancellationToken);
}
catch (DbEntityValidationException dbEntityValidationException)
{
throw ExceptionHelper.CreateFromEntityValidation(dbEntityValidationException);
}
catch (DbUpdateException dbUpdateException)
{
throw ExceptionHelper.CreateFromDbUpdateException(dbUpdateException);
}
}
ব্যতিক্রম হেল্পার ক্লাস:
public class ExceptionHelper
{
public static Exception CreateFromEntityValidation(DbEntityValidationException ex)
{
return new Exception(GetDbEntityValidationMessage(ex), ex);
}
public static string GetDbEntityValidationMessage(DbEntityValidationException ex)
{
// Retrieve the error messages as a list of strings.
var errorMessages = ex.EntityValidationErrors
.SelectMany(x => x.ValidationErrors)
.Select(x => x.ErrorMessage);
// Join the list to a single string.
var fullErrorMessage = string.Join("; ", errorMessages);
// Combine the original exception message with the new one.
var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);
return exceptionMessage;
}
public static IEnumerable<Exception> GetInners(Exception ex)
{
for (Exception e = ex; e != null; e = e.InnerException)
yield return e;
}
public static Exception CreateFromDbUpdateException(DbUpdateException dbUpdateException)
{
var inner = GetInners(dbUpdateException).Last();
string message = "";
int i = 1;
foreach (var entry in dbUpdateException.Entries)
{
var entry1 = entry;
var obj = entry1.CurrentValues.ToObject();
var type = obj.GetType();
var propertyNames = entry1.CurrentValues.PropertyNames.Where(x => inner.Message.Contains(x)).ToList();
// check MS SQL datetime2 error
if (inner.Message.Contains("datetime2"))
{
var propertyNames2 = from x in type.GetProperties()
where x.PropertyType == typeof(DateTime) ||
x.PropertyType == typeof(DateTime?)
select x.Name;
propertyNames.AddRange(propertyNames2);
}
message += "Entry " + i++ + " " + type.Name + ": " + string.Join("; ", propertyNames.Select(x =>
string.Format("'{0}' = '{1}'", x, entry1.CurrentValues[x])));
}
return new Exception(message, dbUpdateException);
}
}
কোন কোড পরিবর্তন প্রয়োজন:
catch {...}
সময় আপনি ডিবাগ মোডে আছেন catch {...}
ব্লকটি "কুইকওয়াচ" উইন্ডোটি খুলুন ( Ctrl + Alt + Q ) এবং সেখানে পেস্ট করুন:
((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors
বা:
((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
আপনি যদি চেষ্টা / ধরা না হন বা ব্যতিক্রম বস্তুর অ্যাক্সেস না পান।
এই আপনি ValidationErrors
গাছ মধ্যে ড্রিল করার অনুমতি দেবে। এই ত্রুটিগুলির মধ্যে তাত্ক্ষণিক অন্তর্দৃষ্টি পেতে এটি সবচেয়ে সহজ উপায়।