Usaga,
Код
System.Data.Entity.Infrastructure.DbUpdateException не обработано
HResult=-2146233087
Message=При обновлении записей произошла ошибка. Подробные сведения см. во внутреннем исключении.
Source=EntityFramework
StackTrace:
в System.Data.Entity.Internal.InternalContext.SaveChanges()
в System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
в System.Data.Entity.DbContext.SaveChanges()
в Procat.MainWindow.Save_Click(Object sender, RoutedEventArgs e) в D:ProcatProcatMainWindow.xaml.cs:строка 71
в System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
в System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
в System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
в System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
в System.Windows.Controls.Primitives.ButtonBase.OnClick()
в System.Windows.Controls.Button.OnClick()
в System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
в System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
в System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
в System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
в System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
в System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
в System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
в System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
в System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
в System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
в System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
в System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
в System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
в System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
в System.Windows.Input.InputManager.ProcessStagingArea()
в System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
в System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
в System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
в System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
в System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
в MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
в MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
в System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
в System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
в MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
в MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
в System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
в System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
в System.Windows.Application.RunDispatcher(Object ignore)
в System.Windows.Application.RunInternal(Window window)
в System.Windows.Application.Run(Window window)
в System.Windows.Application.Run()
в Procat.App.Main() в D:ProcatProcatobjDebugApp.g.cs:строка 0
в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()
InnerException:
HResult=-2146233087
Message=При обновлении записей произошла ошибка. Подробные сведения см. во внутреннем исключении.
Source=System.Data.Entity
StackTrace:
в System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
в System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
в System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
в System.Data.Entity.Internal.InternalContext.SaveChanges()
InnerException:
Class=14
ErrorCode=-2146232060
HResult=-2146232060
LineNumber=1
Message=Violation of PRIMARY KEY constraint 'PK__tmp_ms_x__3214EC0704A01891'. Cannot insert duplicate key in object 'dbo.Procatoff'. The duplicate key value is (0).
The statement has been terminated.
Number=2627
Procedure=""
Server=(LocalDB)MSSQLLocalDB
Source=.Net SqlClient Data Provider
State=1
StackTrace:
в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
в System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
в System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
в System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
в System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
в System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues)
в System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
InnerException:
0
Всем привет, 3 вопроса:
1.такая проблема. EF последняя версия. Visual Studio. Создал простую базу данных. Создал модель. Создал таблицу. Через код добавляю в таблицу данные. Одну строчку он добавляет. Но вот как впишу еще одну например с названием «bu2» то уже ошибка на моменте db.SaveChanges();
System.Data.Entity.Infrastructure.DbUpdateException: «При обновлении записей возникла ошибка. Дополнительные сведения приведены во внутреннем исключении.»
SqlException: Violation of PRIMARY KEY constraint ‘PK__Buffet__3214EC070BE69470’. Cannot insert duplicate key in object ‘dbo.Buffet’. The duplicate key value is (0).
The statement has been terminated.
2.Даже когда на одной строке срабатывает, я открываю таблицу, там нету записанных данных, получается что база данных ничего не записывает?
3.Почему в db. я уже нахожу свою таблицу во множественном числе с буквой s на конце?
class Program
{
static void Main(string[] args)
{
Database1Entities db = new Database1Entities();
var query = from t in db.Buffets select t;
Buffet bu1 = new Buffet { MarketCap = 651616556, Index = "fesfs",
TotalDebt = 56156 };
db.Buffets.Add(bu1);
db.SaveChanges();
foreach (var item in query)
{
Console.WriteLine(item.MarketCap);
}
Console.ReadKey();
}
}
Вот так решается проблема, не хочет автоматом Id прописывать, но второй
вопрос остается все еще открытым.
static void Main(string[] args)
{
using (Database1Entities db1 = new Database1Entities())
{
Buffet bu1 = new Buffet { Id = 0, MarketCap = 651616556, Index =
"SP500", TotalDebt = 79994};
Buffet bu2 = new Buffet { Id = 1, MarketCap = 657145, Index =
"Dow30", TotalDebt = 582166 };
Buffet bu3 = new Buffet { Id = 2, MarketCap = 157212, Index =
"NASDAQ", TotalDebt = 1298974 };
db1.Buffets.Add(bu1);
db1.Buffets.Add(bu2);
db1.Buffets.Add(bu3);
db1.SaveChanges();
var query = from t in db1.Buffets select t;
foreach (var item in query)
{
Console.WriteLine(item.MarketCap);
Console.WriteLine(item.TotalDebt);
}
}
Console.ReadKey();
}
покажите как у вас объявлен Buffet.
PashaPash Если вы вот это имеете ввиду, то вот так:
public virtual DbSet<Buffet> Buffets { get; set; }
Автоматом при создание модели генерирует.
что проверяете именно в той базе?
Захожу в таблицу Buffet, а там всюду null, после отладки не сохраняются данные.
как именно у вас база подключена?
Она подключена обычно:) не знаю как точно ответить. Создал простую базу в VS, создал модель. На ней зеленая розетка, но при запуске отладки загорается крестик красные, может она просто отключается на отладку. Нашел тут на форму ответ, что нужно поставить if newer в свойствах базы данных. Я та понял это в свойствах базы данных, у меня рус. версия. Как я понял это связано с «Копировать в выходной каталог», но переключая там на разные вкладки снова ошибка на SaveChages().
Hello im kind new in MVC and i made a website so first i set a models and then from this model»with declaring the Db Context » i create a Controller and view from that and when i view it in website form it use to work fine and i can create data in the data base but then when i create everything i want to add a foreign key between the tables so i went the table and i added it and update but there is an error shows up when ever i try to add new data into the table so what should i do i hope that someone help me out this is some pic of the error and the table
this is the controller
the foreign key in the table
the code that send the error
public ActionResult Create([Bind(Include = "ID,UserID,KickOffDate")] UseCase useCase)
{
if (ModelState.IsValid)
{
db.UseCase.Add(useCase);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(useCase);
}
asked Aug 14, 2017 at 4:02
2
-
Delete your current migrations folder. (I trust you do not have any
expensive data) -
Change the name of your data table in the Config.Sys file.
-
Delete the table in App_Data
-
Then enable migrations.
-
Create a Add-Migration somename again
-
Then… Update-Data
answered Aug 14, 2017 at 13:45
alikulialikuli
5266 silver badges18 bronze badges
0
I think your problem will solve with the migration. For migrate do the following:
Open Package Manager Console
Tools –> Library Package Manager –> Package Manager Console
Then use the following commands
PM> Enable-migrations
PM> Add-migration Example // You can give a name instead of "Example"
PM> Update-database
answered Aug 14, 2017 at 4:12
![]()
Alsamil MehboobAlsamil Mehboob
3942 gold badges6 silver badges23 bronze badges
2
Hello im kind new in MVC and i made a website so first i set a models and then from this model»with declaring the Db Context » i create a Controller and view from that and when i view it in website form it use to work fine and i can create data in the data base but then when i create everything i want to add a foreign key between the tables so i went the table and i added it and update but there is an error shows up when ever i try to add new data into the table so what should i do i hope that someone help me out this is some pic of the error and the table
this is the controller
the foreign key in the table
the code that send the error
public ActionResult Create([Bind(Include = "ID,UserID,KickOffDate")] UseCase useCase)
{
if (ModelState.IsValid)
{
db.UseCase.Add(useCase);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(useCase);
}
asked Aug 14, 2017 at 4:02
2
-
Delete your current migrations folder. (I trust you do not have any
expensive data) -
Change the name of your data table in the Config.Sys file.
-
Delete the table in App_Data
-
Then enable migrations.
-
Create a Add-Migration somename again
-
Then… Update-Data
answered Aug 14, 2017 at 13:45
alikulialikuli
5266 silver badges18 bronze badges
0
I think your problem will solve with the migration. For migrate do the following:
Open Package Manager Console
Tools –> Library Package Manager –> Package Manager Console
Then use the following commands
PM> Enable-migrations
PM> Add-migration Example // You can give a name instead of "Example"
PM> Update-database
answered Aug 14, 2017 at 4:12
![]()
Alsamil MehboobAlsamil Mehboob
3942 gold badges6 silver badges23 bronze badges
2
Ошибка объекта данных «Ошибка при обновлении записей. Подробнее см. Внутреннее исключение».
Вопрос:
Я новичок в Entity Framework, я уже искал в google для этой проблемы, но ничего не нашел. Я получаю ошибку
При обновлении записей произошла ошибка. Подробнее см. Внутреннее исключение.
и когда я проверил внутреннее исключение, я вижу это
Невозможно вставить значение NULL в столбец “DOCNUM”, таблицу “TCPIDBV2.dbo.tbl_200_Dailyreport”; столбец не допускает нулей. INSERT терпит неудачу.
Но когда я проверил записи, которые я передал для сохранения в базе данных, в этом объекте есть значение, называемое “DOCNUM”,
Это мой код:
[Table("tbl_200_Dailyreport")]
public class tbl_200_Dailyreport
{
[Key]
[Required]
public long DOCNUM {get; set;}
public DateTime DAILYREPDATE {get; set;}
public string SECTION {get; set;}
public string REMARKS { get; set; }
public int? OPERATIONTIME { get; set; }
public int? PREPARATIONTIME { get; set; }
public int? STANDBYTIME { get; set; }
public int? MATERIALWAITING { get; set; }
public int? ASSISTTIME { get; set; }
public int? MAINTENANCETIME { get; set; }
public int? CLEANINGTIME { get; set; }
public bool? ISOVERTIME { get; set; }
public bool? ISLOCKED { get; set; }
public string SHIFT { get; set; }
public int? PRODTIME { get; set; }
public int? BREAKTIME { get; set; }
public double? TOTALCOLOR { get; set; }
public double? AVERAGECOLOR { get; set; }
}
При получении значения вышеприведенного здесь приведен код:
tbl_200_Dailyreport.DOCNUM = long.Parse(txtReferenceNo.Text);
tbl_200_Dailyreport.PRODTIME = Convert.ToInt32(txtProduction.Text);
tbl_200_Dailyreport.OPERATIONTIME = Convert.ToInt32(txtOperation.Text);
tbl_200_Dailyreport.PREPARATIONTIME = Convert.ToInt32(txtPreparation.Text);
tbl_200_Dailyreport.STANDBYTIME = Convert.ToInt32(txtStandby.Text);
tbl_200_Dailyreport.MAINTENANCETIME = Convert.ToInt32(txtMaintenance.Text);
tbl_200_Dailyreport.CLEANINGTIME = Convert.ToInt32(txtCleaning.Text);
tbl_200_Dailyreport.MATERIALWAITING = Convert.ToInt32(txtMaterial.Text);
tbl_200_Dailyreport.ASSISTTIME = Convert.ToInt32(txtAssist.Text);
tbl_200_Dailyreport.BREAKTIME = Convert.ToInt32(txtOthers.Text);
tbl_200_Dailyreport.DAILYREPDATE = dtpDailyReportDate.Value;
tbl_200_Dailyreport.SHIFT = cboShift.SelectedValue.ToString();
tbl_200_Dailyreport.ISOVERTIME = cbxOvertime.Checked;
tbl_200_Dailyreport.ISLOCKED = false;
tbl_200_Dailyreport.REMARKS = txtRemarks.Text;
if (!String.IsNullOrEmpty(cboSecDepartment.Text))
{
tbl_200_Dailyreport.SECTION = cboSecDepartment.SelectedValue.ToString();
}
else
{
var section = "0";
tbl_200_Dailyreport.SECTION = section;
}
Я разрешаю всем столбцам значение null, за исключением PK, называемого “DOCNUM”, поэтому при получении значения “DOCNUM”, где txtreferenceno.Text имеет значение, равное 1. и передал его в DailyReportManager, так вот код:
public void Save(tbl_200_Dailyreport records)
{
try
{
this.db.tbl_200_Dailyreport.Add(records);
this.db.SaveChanges();
}
catch (Exception ex)
{
throw ex;
}
}
и в получении значения txtreferenceno.Text
var max = dailyreportmanager.FindAll().Max(x => (int?)x.DOCNUM) ?? 0;
var addMax = max + 1;
txtReferenceNo.Text = Convert.ToString(addMax);
поэтому для дизайна моей базы данных
Позвольте мне опубликовать снимок экрана:
Дизайн базы данных
Когда я проверил записи, значение “DOCNUM” имеет значение, равное единице, но почему я все еще получаю эту ошибку? Пожалуйста помоги. Большое спасибо заранее.
Лучший ответ:
Чтобы указать Entity Framework, которую вы хотите вручную указать значение ключа, укажите этот атрибут:
[DatabaseGenerated(DatabaseGeneratedOption.None)]
против DOCNUM.
У меня проблема, я только начал изучать модель EF, и я остаюсь в одной точке в течение некоторого времени. Я получил такую ошибку:
» при обновлении записей произошла ошибка. См. внутреннее исключение для деталей»
Я создал простой модели, схемы, создание базы данных и написал простой код на C#, чтобы добавить только одну строку в таблице, но ошибка появляется все время.
Я публикую скриншот с диаграммой / сгенерированной DLL / простой основной / и ошибка метания

Ссылка для большего размера:http://i.imgur.com/bKGc4wv.png
7 ответов
повернуть Pluralization On. Проблема в том, что вы моделируете объект, используя единственное имя (Pupil) соглашение, в то время как в вашей базе данных вы используете несколько имен Pupils С s.
обновление
этой в должности показывает, как вы можете включить его или выключить.
Некоторые соответствующие выдержки из этого поста:
для включения и выключения плюрализации
-
в меню Сервис выберите Опции.
-
в диалоговом окне Параметры разверните узел базы данных.
Примечание: выберите Показать все параметры, если узел инструменты базы данных не отображается. -
Нажмите O/R Designer.
-
установите Плюрализацию имен в Enabled = False для установки конструктора O/R, чтобы он не изменял имена классов.
-
установите Плюрализацию имен в Enabled = True, чтобы применить правила плюрализации к именам классов объекты, добавленные в реляционный конструктор объектов.
обновление 2
но обратите внимание, что вы должны избегать множественных имен.
Вы можете читать здесь как это сделать (я приведу его здесь, на случай, если ссылка будет нарушена).
(…) при первом подходе к коду Entity Framework таблицы базы данных создаются из классов моделей. Обычно Entity Framework создает таблицы с несколькими именами. это означает, что если у вас есть класс модели PhoneNumber, Entity framework создаст таблицу для этого класса под названием «PhoneNumbers». Если вы хотите избежать множественного имени и хотите единственное имя, как клиент , вы можете сделать это так
В вашем классе DBContext переопределите метод «OnModelCreating» следующим образом (…)

(…) переопределение этого метода позволит избежать создания таблиц с множественными именами. Теперь он создаст Таблица называется «PhoneNumber», а не» PhoneNumbers»(…)
Это может быть причиной преобразования данных из .net в sql. например, ошибка преобразования datetime.
вообще это не точная ошибка. вы можете увидеть точную ошибку в watch at exception.Свойство innerexception.InnerException — > ResultView.
для меня это была пустая ссылка на столбец datetime
Я столкнулся с той же ошибкой:
» при обновлении записей произошла ошибка. См. внутреннее исключение
для детали»
просто удалить и заново создать *.файл edmx. Это сработало для меня. ошибка исчезнет
недавно у меня была эта проблема.
Это произошло, потому что разрешения пользовательской базы данных.
проверьте разрешения базы данных пользователя, возможно, у пользователя нет разрешения на запись в БД.
я столкнулся с той же проблемой, и не вышеперечисленные решения помогли мне. В моем Web Api 2 проект, я фактически обновил свою базу данных и разместил unique constraint на SQL table column. это действительно было причиной проблемы. Просто проверка повторяющихся значений столбцов перед вставкой помогла мне устранить проблему!
для записи у меня была эта проблема и была глупая ошибка с моей стороны. Моей проблемой было несоответствие типов данных.
Тип данных в таблице базы данных и классах C# должен быть одинаковым……
моя проблема заключалась в том, что идентификатор таблицы не является AUTO_INCREMENT, и я пытался добавить диапазон.
У меня проблема, я только начал изучать EF Model First и какое-то время остаюсь в одной точке. У меня такая ошибка:
«Произошла ошибка при обновлении записей. Подробнее см. Внутреннее исключение»
Я создал простую модель на диаграмме, сгенерировал базу данных и написал простой код на C #, чтобы добавить только одну строку в таблицу, но ошибка появляется все время.
Я публикую снимок экрана с Diagram / Generated DLL / Simple Main / И выбросом ошибок

Ссылка для увеличения размера: http://i.imgur.com/bKGc4wv.png
- 1 Что такое внутренняя ошибка?
- 2 означает то, что написано. Вы вызываете объект , который не существует. Вы использовали EF для множественного числа ваших таблиц? Если это так, таблица EF могла бы быть чем-то странным, например «Pupilss». Обычно таблица базы данных имеет единственное число, а EF — множественное число. И наличие перед ним тоже странно.
- 1 Правильно ли настроена ваша строка подключения для указания на эту базу данных? Где ваш код для сопоставления ваших классов с базой данных? Отправьте код и сохраните снимки экрана, чтобы наглядно понять, что происходит не так. Просто скопируйте и вставьте деталь об исключении вместо снимка экрана этого окна.
- просто другое решение: для меня это было потому, что длина строки была больше, чем длина varchar столбца DB.
Включите . Проблема в том, что вы моделируете объект, используя соглашение о единственном числе (), а в вашей базе данных вы используете имена во множественном числе с .
ОБНОВИТЬ
В этом посте показано, как его включить или выключить. Некоторые важные выдержки из этого поста:
Включение и выключение множественного числа
-
В меню «Сервис» выберите «Параметры».
-
В диалоговом окне Параметры разверните Инструменты баз данных. Примечание. Выберите «Показать все параметры», если узел «Инструменты для баз данных» не отображается.
-
Щелкните O / R Designer.
-
Установите для параметра Pluralization of names значение Enabled = False, чтобы настроить конструктор O / R таким образом, чтобы он не изменял имена классов.
-
Установите для множественного числа имен значение Enabled = True, чтобы применить правила множественного числа к именам классов объектов, добавленных в конструктор O / R.
ОБНОВЛЕНИЕ 2
Но учтите, что вам следует избегать имен во множественном числе. Вы можете прочитать здесь, как это сделать (я процитирую это здесь, на случай, если ссылка не работает).
(…) Когда вы работаете с подходом Entity Framework Code First, вы создаете таблицы базы данных из классов модели. Обычно Entity Framework создает таблицы с именами во множественном числе. это означает, что если у вас есть класс модели с именем PhoneNumber, инфраструктура Entity создаст для этого класса таблицу с именем «PhoneNumbers». Если вы хотите избежать имени во множественном числе и хотите использовать имя в единственном числе, например Customer, вы можете сделать это следующим образом. В вашем классе DBContext переопределите метод «OnModelCreating» следующим образом (…)

(…) Переопределение этого метода позволит избежать создания таблиц с именами во множественном числе. Теперь он создаст таблицу под названием «PhoneNumber», а не «PhoneNumbers». (…)
- Где мне его включить?
- 2 К сожалению, у меня включена плюрализация, так что проблема не в этом: /
- @CSharpBeginner Я предлагаю вам создать таблицы с единственными именами, а затем в вашем коде также принудительно использовать единственные имена, как показано на изображении выше. попробуйте.
Это могло быть вызвано преобразованием данных из .NET в SQL, например ошибкой преобразования даты и времени. Для меня это была пустая ссылка на столбец datetime.
Кроме того, это не точное сообщение об ошибке. Вы можете увидеть точную ошибку в часах в exception.InnerException.InnerException -> ResultView.
- Это то, что было для меня.
- Полезное предложение найти , точное сообщение получил как Несоответствие названия объекта. Имя таблицы в базе данных и определенная сущность имели разные имена
- что значит «в часах»?
- Ах, всплывающее окно исключения QuickWatch в Visual Studio.
Что касается записей, у меня была эта проблема, и я допустил глупую ошибку. Моя проблема заключалась в несоответствии типов данных. Тип данных в таблице базы данных и в классах C # должен быть одинаковым ……
Моя проблема заключалась в том, что идентификатор таблицы не AUTO_INCREMENT, и я пытался добавить диапазон.
Просмотрите внутреннее исключение исключения, чтобы получить более конкретное сообщение об ошибке.
Один из способов просмотреть внутреннее исключение — это перехватить исключение и установить на нем точку останова. Затем в окне «Местные жители»: выберите переменную исключения> InnerException> Сообщение
И / или просто напишите в консоль:
- Чтобы выяснить причину исключения DbUpdateException, требуется нечто большее.
- Получить причину «Произошла ошибка при обновлении записей. См. Подробности во внутреннем исключении» — нет.
- 1 Спасибо, что показали мне, как увидеть InnerException. Это приближает меня к решению в моем случае. Я дал за это голос
У меня была такая же проблема с SaveChanges () в EF, но в моем случае я забыл обновить свою таблицу sql, а затем после того, как я использовал миграцию, моя проблема решена, поэтому, возможно, обновление ваших таблиц решит проблему.
Я столкнулся с той же ошибкой:
«Произошла ошибка при обновлении записей. Подробнее см. Внутреннее исключение»
Просто Удалить и воссоздать файл * .edmx. Это сработало для меня. ошибка исчезнет
- Это не может быть решением, если и только если это сработает в вашем случае, тогда я бы сказал, что это был взлом, а не решение.
У меня недавно была эта проблема. Это произошло из-за прав доступа базы данных пользователей. проверьте разрешения пользовательской базы данных, возможно, у пользователя нет разрешения на запись в db.
Я столкнулся с той же проблемой, и ни одно из вышеперечисленных решений мне не помогло. В моем проекте я фактически обновил свою базу данных и поместил на , что на самом деле вызывало проблему. Простая проверка повторяющихся значений столбца перед вставкой помогла мне решить проблему!
В моем случае … решены следующие шаги:
Было значение столбца, для которого было установлено значение «Обновить» — заменили его на «Изменить» (не ключевое слово sql). В одном из имен столбцов был пробел (лишний пробел или обрезка удалены)
Продолжим изучение возможностей Entity Framework Code First для указания соотношений классов Модели и создаваемых таблиц. На очереди второй способ – использование Fluent API.
Потоковый интерфейс (Fluent API)
Потоковый интерфейс это способ реализации программного интерфейса библиотеки, который обеспечивает создание более удобного для чтения исходного кода программы. При этом можно выделить следующие признаки:
- Методы возвращают объекты, что позволяет вызывать их цепочкой в рамках одного оператора.
- Имена методов подбираются так, чтобы обеспечить максимально понятный код.
Чтобы лучше понять суть Fluent API, давайте посмотрим как может выглядеть запись оператора с использованием такого подхода:
modelBuilder.Entity<Gamer>()
.HasRequired(e => e.ReserveTeam)
.WithMany(t => t.Reserve)
.HasForeignKey(e => e.ReserveId)
.WillCascadeOnDelete(false);
Правильно подобранные названия методов обеспечивают лёгкое понимание цели исходного кода. Например, в приведенном выше коде можно легко прочитать, что:
в сущности, описанной классом Gamer .есть обязательное навигационное поле ReserveTeam .связанное с коллекцией Reserve в другой сущности (таблице) .при помощи внешнего ключа ReserveId .без каскадного удаления записей
Кроме того, такой подход очень удобен при использовании совместно с контекстными подсказками, такими как IntelliSense в Visual Syudio. В этом случае они наглядно указывают возможные дальнейшие действия в зависимости от текущего контекста.
В качестве минуса потокового интерфейса необходимо отметить невозможность указания точки останова для отладчика между вызовами методов в цепочке.
В этой серии статей под Fluent API будем понимать, как правило, реализацию интерфейса Entity Framework Code First для настройки параметров генерации таблиц.
Использование Entity Framework Fluent API
Как уже было отмечено, при использовании Entity Framework Fluent API нет необходимости модифицировать Модель. Параметры создания таблиц определяются программно. Необходимый для этого код размещается внутри метода OnModelCreating(DbModelBuilder modelBuilder), переопределенного в соответствующем классе контекста базы данных.
Построение выражений для каждого нового правила начинается с экземпляра DbModelBuilder, полученного в качестве параметра. Его метод Entity<T>() возвращает объект типа EntityTypeConfiguration. Он, в свою очередь, используется для настройки параметров генерации таблицы для сущности указанного типа T. Вот пример кода на основе класса контекста CatalogContext из создаваемого веб-приложения:
namespace BookCatalog.Models.DbContext
{
using System.Data.Entity;
using BookCatalog.Models;
public class CatalogContext : DbContext
{
// You can add custom code to this file. Changes will not be overwritten.
//
// If you want Entity Framework to drop and regenerate your database
// automatically whenever you change your model schema, add the following
// code to the Application_Start method in your Global.asax file.
// Note: this will destroy and re-create your database with every model change.
//
// System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<BookCatalog.Models.CatalogContext>());
public DbSet<Tag> Tags { get; set; }
public DbSet<Publisher> Publishers { get; set; }
public DbSet<Language> Languages { get; set; }
public DbSet<BookDetails> Books { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// место для вызовов Entity Framework Fluent API
}
}
}
В приведенном примере отмечено место добавления вызовов Fluent API. Их, в зависимости от цели, можно разделить на три группы:
- Настройка свойств;
- Настройка типов;
- Настройка взаимосвязей между сущностями.
Давайте рассмотрим каждую группу в отдельности подробнее и с небольшими примерами.
Настройка свойств с использованием Fluent API
Для настройки параметров соотношения отдельных свойств и колонок таблицы в базе данных класс EntityTypeConfiguration предоставляет метод Property(). Он возвращает объект, являющийся одним из наследников класса PrimitivePropertyConfiguration, которые и содержит необходимые методы. Посмотрим на некоторые из них на примерах.
Указание первичного ключа
И начнём сразу с исключения. Дело в том, что первичный ключ задается вызовом HasKey() класса EntityTypeConfiguration. Для примера, укажем в этой роли свойство Id сущности BookDetails:
modelBuilder.Entity<BookDetails>().HasKey(b => b.Id);
В качестве параметра передается лямбда-выражение, которое возвращает значение свойства, выбранного для первичного ключа. На основе полученного параметра, ядро Entity Framework определит необходимое свойство и создаст первичный ключ на его основе. Стоит отметить, что именно так во многих методах Fluent API указываются свойства для настройки.
Если необходимо задать составной первичный ключ по двум свойствам, то код будет выглядеть так:
modelBuilder.Entity<Publisher>().HasKey(p => new { p.Title, p.Homepage } );
Атрибут-аналог: [Key].
Ограничение длины строки
Ограничим длину свойства Title класса BookDetails в 128 символов:
modelBuilder.Entity<BookDetails>().Property(p => p.Title)
.HasMaxLength(128);
Атрибут-аналог: [MaxLenght].
Обязательное к заполнению свойство
Также для указанного в прошлом примере свойства установим необходимость всегда содержать значение
modelBuilder.Entity<BookDetails>().Property(p => p.Title)
.IsRequired();
Атрибут-аналог: [Require].
Установка способа генерации значения
Предположим, что для свойства Id класса BookDetails значения будет указывать бизнес-логика самостоятельно. Тогда необходимо отключить их генерирование на стороне базы данных:
modelBuilder.Entity<BookDetails>().Property(p => p.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Атрибут-аналог: [DatabaseGenerated].
Исключение свойства при создании таблицы
Предположим, что в классе BookDetails есть свойство TotalTagsLenght. Его не требуется включать в базу данных, так как это значение вычисляется бизнес-логикой веб-приложения. Указать это можно следующим способом:
modelBuilder.Entity<BookDetails>().Ignore(t => t.TotalTagsLenght);
Атрибут-аналог: [NotMapped].
Указание имени для колонки в базе данных
Для свойства PublishedAt класса BookDetails установим текст «PublishDate» в качестве имени колонки:
modelBuilder.Entity<BookDetails>().Property(t => t.PublishedAt)
.HasColumnName("PublishDate");
Атрибут-аналог: [Column].
Указание использовать или не использовать уникод для текстового поля
По умолчанию, на основе всех свойств типа string будут созданы колонки типа nvarchar, т.е. с поддержкой уникода. При необходимости можно изменить это поведение:
modelBuilder.Entity<BookDetails>().Property(t => t.Author)
.IsUnicode(false);
Атрибут-аналог: [Column] c явным указанием типа колонки.
Указание порядка колонки в таблице
Указать порядковый номер колонки в таблице можно используя метод HasColumnOrder():
modelBuilder.Entity<BookDetails>().Property(t => t.Author)
.HasColumnOrder(2);
Атрибут-аналог: [Column] c явным указанием порядкового номера.
Указание использовать определенный тип для колонки в базе данных
Fluent API позволяет указать тип, который должна содержать связанная со свойством колонка:
modelBuilder.Entity<BookDetails>().Property(t => t.Author)
.HasColumnType("varchar");
Атрибут-аналог: [Column] c явным указанием типа колонки.
Конфигурация вложенных типов
Рассмотрим ситуацию, когда класс Customer включает в себя экземпляр класса Address. В последнем есть свойство Street, которому необходимо установить максимальную длину строки в 128 символов. Такая задача легко решается с помощью Fluent API:
modelBuilder.Entity<Customer>().Property(t => t.Address.Street)
.HasMaxLength(128);
Стоит отметить, что основное преимущество Fluent API проявляется при необходимости указать несколько параметров соотношения для одного свойства. И несмотря на то, что в примерах выше настраивается по одному свойству, следующая запись корректна:
modelBuilder.Entity<BookDetails>().Property(t => t.Title)
.IsRequired()
.HasMaxLength(128)
.HasColumnName("BookTitle")
.HasColumnOrder(2);
Оставим небольшое число методов для самостоятельного изучения и перейдем к настройке параметров отображения для типов.
Настройка типов с использованием Fluent API
Для типов Fluent API позволят настроить имя таблицы, схему отображения типов и исключения. Давайте сразу перейдем к конкретным примерам.
Указание имени таблицы
Допустим необходимо присвоить имя «Catalog» для таблицы, в которой будут располагаться данные из экземпляров класса BookDetails. Код этой настройки будет следующий:
modelBuilder.Entity<BookDetails>().ToTable("Catalog");
Атрибут-аналог: [Table].
Исключение типа при создании таблицы
Entity Framework Code First автоматически определяет используемые типы и размещает их в таблицах создаваемой базы данных. В некоторых случаях необходимо исключить определенные классы из этого процесса. Например, если данные для них вычисляются. Код, решающий эту задачу, выглядит следующим образом:
modelBuilder.Ignore<Tag>();
В данном случае экземпляры класса Tag не будут сохраняться в базе данных. Равно как и не будет создана соответствующая таблица.
Указание сложных типов
Entity Framework Code First также автоматически распознает сложные типы. Однако в некоторых случаях могут быть ошибки. Например, если в таком классе есть поле Id для каких-либо целей. Тогда потребуется указать его с помощью FluentAPI:
modelBuilder.ComplexType<SomeComplexType>();
Настройка отображения «Таблица для иерархии (Table per hierarchy)»
При использовании данного типа отображения наследования, для всех классов, унаследованных от общего базового, создается единая таблица. В Code First это вариант по умолчанию. При этом в таблицу добавляется колонка под названием Discriminator, в которой указывается имя конкретного типа для каждой строки. Переопределить такое поведение можно следующим образом:
modelBuilder.Entity<BaseType>()
.Map<BaseType>(m => m.Requires("Type").HasValue("BaseType"))
.Map<ChildType>(m => m.Requires("Type").HasValue("ChildType"));
Настройка отображения «Таблица для каждого конкретного типа (Table per concrete type)»
Тип отображения наследования «таблица для каждого конкретного типа» подразумевает, что создаются индивидуальные таблицы для каждого конкретного типа. Определить такое поведение при помощи Fluent API можно следующим образом:
modelBuilder.Entity<BaseType>()
.Property(p => p.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
modelBuilder.Entity<ChildType>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("ChildType");
});
Настройка отображения «Таблица для каждого типа (Table per type)»
Этот вариант отображения наследования предусматривает, что создается одна таблица на основе базового типа для общих свойств. Все остальные размещаются в вспомогательных таблицах. Задается такая схема следующим образом:
modelBuilder.Entity<BaseType>().ToTable("BaseType");
modelBuilder.Entity<ChildType>().ToTable("ChildType");
Разделение одного типа по нескольким таблицам
В некоторых ситуация необходимо разделить существующий класс на несколько таблиц с целью оптимизации производительности.
Предположим, что свойства Id, Title, Author и Url класса BookDetails запрашиваются наиболее часто. Поэтому расположим их в отдельной таблице:
modelBuilder.Entity<BookDetails>()
.Map(m => {
m.Properties(b => new { b.Id, b.Title, b.Author, b.Url });
m.ToTable("Catalog");
})
.Map(m => {
m.Properties(b => new {
b.Description,
b.IsFree,
b.IsVisible,
b.LanguageId,
b.PublishedAt,
b.PublisherId,
b.Rating });
m.ToTable("BookDetails");
});
Объединение нескольких классов в одну таблицу
Данный сценарий может пригодиться для оптимизации в случае связи «одна строка к одной». Например, пусть каждый судья (класс Arbitter) может быть назначен только на одну игру (класс Game). Тогда код Fluent API будет выглядеть следующим образом:
modelBuilder.Entity<Game>()
.HasKey(g => g.ArbitterID);
modelBuilder.Entity<Arbitter>()
.HasRequired(a => a.Game)
.WithRequiredPrincipal(t => t.Arbitter);
modelBuilder.Entity<Arbitter>().ToTable("Games");
modelBuilder.Entity<Game>().ToTable("Games");
В следующей части тема настройки Модели для Code First будет продолжена. В ней рассмотрим возможности Fluent API для указания связей между таблицами.
Поверните Pluralization On. Проблема заключается в том, что вы моделируете объект с использованием соглашения об уникальном имени (Pupil), тогда как в вашей базе данных вы используете плюрализированные имена Pupils с s.
UPDATE
Этот post показывает, как включить или выключить его.
Некоторая релевантная выдержка из этой публикации:
Включение и выключение плюрализации
-
В меню «Сервис» выберите «Параметры».
-
В диалоговом окне «Параметры» разверните «Инструменты базы данных».
Примечание. Выберите «Показать все настройки», если инструменты базы данных node не отображаются. -
Нажмите O/R Designer.
-
Задайте плюрализацию имен Enabled = False, чтобы установить конструктор O/R, чтобы он не менял имена классов.
-
Установить плюрализацию имен на Enabled = True, чтобы применить правила плюрализации к именам классов объектов, добавленных в конструктор O/R.
ОБНОВЛЕНИЕ 2
Но обратите внимание, что вам следует избегать плюрализованных имен.
Вы можете прочитать здесь, как это сделать (я приведу его здесь, на всякий случай, когда ссылка сломается).
(…) Когда вы работаете с подходом Entity Framework Code First, вы создаете таблицы базы данных из своих классов моделей. Обычно Entity Framework создает таблицы с плюрализуемыми именами. это означает, что если у вас есть класс модели под названием PhoneNumber, инфраструктура Entity создаст таблицу для этого класса под названием «PhoneNumbers». Если вы хотите избежать плюрализованного имени и хотите иметь уникальное имя, например Customer, вы можете сделать это так
В вашем классе DBContext переопределите метод OnModelCreating, подобный этому (…)

(…) Наличие этого метода переопределения позволит избежать создания таблиц с плюрализованными именами. Теперь он создаст таблицу под названием «PhoneNumber», а не «PhoneNumbers» (…)
Когда я удаляю элемент в списке, я получаю сообщение об ошибке, как показано на скриншоте ниже:

Я не знаю, где находится внутреннее исключение, но я попытался попробовать, поймать, но получил ту же ошибку в вопросе.
Вот весь код:
namespace WpfApplication7
{
/// <summary>
/// Interaction logic for Edit_Rooms.xaml
/// </summary>
public partial class Edit_Rooms : Window
{
public Edit_Rooms()
{
InitializeComponent();
}
//initialises entities
WpfApplication7.AllensCroftEntities1 allensCroftEntities1 = new WpfApplication7.AllensCroftEntities1();
private Room ObjectIndex;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// Load data into Rooms.
System.Windows.Data.CollectionViewSource roomsViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("roomsViewSource")));
//runs a query to go the roomsQuery to get the rooms table from the entities
System.Data.Objects.ObjectQuery<WpfApplication7.Room> roomsQuery = this.GetRoomsQuery(allensCroftEntities1);
//used when adding new rooms
roomsViewSource.Source = roomsQuery.Execute(System.Data.Objects.MergeOption.AppendOnly);
}
private System.Data.Objects.ObjectQuery<Room> GetRoomsQuery(AllensCroftEntities1 allensCroftEntities1)
{
System.Data.Objects.ObjectQuery<WpfApplication7.Room> roomsQuery = allensCroftEntities1.Rooms;
// Returns an ObjectQuery.
return roomsQuery;
}
private void btnDelete_Click(object sender, RoutedEventArgs e)
{
//prevents user trying to delete nothing/unselected row
if (ObjectIndex == null)
{
MessageBox.Show("Cannot delete the blank entry");
}
else
{
//deletes object from dataset, saves it and outputs a message
allensCroftEntities1.DeleteObject(ObjectIndex);
allensCroftEntities1.SaveChanges();
MessageBox.Show("Room Deleted");
}
}
private void btnSave_Click(object sender, RoutedEventArgs e)
{
try
{
//attempts to save changes
allensCroftEntities1.SaveChanges();
MessageBox.Show("Saved");
}
catch (Exception ex)
{
//if unsuccessful, outputs an error message
MessageBox.Show(ex.ToString());
}
}
private void btnFirst_Click(object sender, RoutedEventArgs e)
{
listbox.SelectedIndex = 0;
}
private void btnPrevious_Click(object sender, RoutedEventArgs e)
{
//prevents user going to the previous item before the first item
if (listbox.SelectedIndex > 0)
{
listbox.SelectedIndex -= 1;
}
}
private void btnNext_Click(object sender, RoutedEventArgs e)
{
//prevents user going after last item and throwing up an error
if (listbox.SelectedIndex < listbox.Items.Count)
{
listbox.SelectedIndex += 1;
}
}
private void btnLast_Click(object sender, RoutedEventArgs e)
{
listbox.SelectedIndex = listbox.Items.Count - 1;
}
private void listbox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
//outputs index of the selected room
ObjectIndex = listbox.SelectedItem as Room;
}
}
}