An error occurred while saving entities to the database see inner exception for details перевод

Исключение при попытке добавить элемент в БД (entity framework) C# Решение и ответ на вопрос 1828978

olegall

0 / 0 / 0

Регистрация: 27.01.2014

Сообщений: 116

1

18.10.2016, 15:47. Показов 22941. Ответов 6

Метки нет (Все метки)


Пытаюсь сохранить объект в БД:

C#
1
2
3
4
5
6
7
8
9
10
      public void Add(EntityModels entity)
        {
            //dbContext.Database.ExecuteSqlCommand("INSERT INTO dbo.Entities (CategoryId, Applicability, Number, Name, Engineer, Text, PathToPDF, PathToImage) VALUES ('" + entity.CategoryId + "', '" + entity.Applicability + "', '" + entity.Number + "', '" + entity.Name + "', '" + entity.Engineer + "', '" + entity.Text + "', '" + entity.PathToPDF + "', '" + entity.PathToImage + "')");
            //entity.PathToPDF = "";
            dbContext.Entities.Add(entity);
            dbContext.Entry(entity).State = System.Data.Entity.EntityState.Added;
            dbContext.Entry(entity).State = System.Data.Entity.EntityState.Modified;
            dbContext.Configuration.AutoDetectChangesEnabled = true;
            dbContext.SaveChanges();
        }

получаю исключение:

An exception of type ‘System.Data.Entity.Infrastructure.DbUpdateExcepti on’ occurred in EntityFramework.dll but was not handled in user code на методе SaveChanges

Additional information: An error occurred while updating the entries. See the inner exception for details.

все поля модели и таблицы БД соответствуют друг другу (типы, их число и названия), делал повторно миграцию — всё чисто.
NULL-в сохраняемых данных нет.
Причём занесение данных через прямой sql запрос (1-я закомментированная строка) проходит корректно. Эксперименторивал с комбинациями строк 3,4,5 метода. Гуглил — не помогло. Как отлаживать такие ошибки?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



783 / 615 / 272

Регистрация: 04.08.2015

Сообщений: 1,707

18.10.2016, 17:32

2

Цитата
Сообщение от olegall
Посмотреть сообщение

dbContext.Entry(entity).State = System.Data.Entity.EntityState.Added;
dbContext.Entry(entity).State = System.Data.Entity.EntityState.Modified;

Какой смысл одному свойству дважды присваивать значение? Останется то, что во 2-й строке.
Вангую, что вы новую запись принудительно объявляете модифицированной. После этого вместо Insert пытается выполниться Update, который не проходит.



0



0 / 0 / 0

Регистрация: 27.01.2014

Сообщений: 116

18.10.2016, 18:29

 [ТС]

3

строки 6,7,8 я поочерёдно комментировал в разных комбинациях
Added не проходит



0



91 / 90 / 37

Регистрация: 05.08.2011

Сообщений: 428

18.10.2016, 19:05

4

olegall, комментируйте разом. 6,7,8 строки. Где-то до этого в коде отключаете авто детект изменений?
Для чего, сначала добавляете сущность (5 строка), стандартно она будет помечена добавленной, затем помечаете её добавленной (6 строка), затем обновленной (7 строка), потом включаете детект изменений (8 строка). Последнее вообще не понятно для чего.
+ в сообщении ошибки указано:

Цитата
Сообщение от olegall
Посмотреть сообщение

See the inner exception for details.

Вы смотрели? Что там написано?



0



olegall

0 / 0 / 0

Регистрация: 27.01.2014

Сообщений: 116

19.10.2016, 09:27

 [ТС]

5

Где-то до этого в коде отключаете авто детект изменений?

— это не понял. я ничего подобного вроде не делал

Inner exception: Invalid object name ‘dbo.EntityModels’. — видимо означает попытка обращения к таблице в БД EntityModels. Но такой таблицы нет (есть Entities). Причём я помню что такая таблица как-то появлялась, и я её удалял. Возможно эта инфо сохранилась в кеше или ещё где-то. Поиск в проекте по строке «dbo.EntityModels» ничего не дал

Добавлено через 6 минут
Контекст:

C#
1
2
3
4
5
6
7
namespace Engine.Models
{
    public class EntityContext : DbContext
    {
        public DbSet<EntityModels> Entities { get; set; }
    }
}

Добавлено через 16 минут
UPD:
я создал таблицу EntityModels — клон Entities — и исключение пропало. Как теперь избавить проект от информации о таблице
EntityModels? Я удалял папку migrations, создал миграцию заново — не помогло



0



lvlkoo

.NET C#,ASP.NET MVC

Эксперт .NET

592 / 503 / 225

Регистрация: 16.10.2010

Сообщений: 1,902

19.10.2016, 17:07

6

olegall, название таблицы определяется не названием свойства в контексте, а названием сущности.

То есть если у вас сущность называется EntityModels, то и таблица будет называться EntityModels.

Название табицы можно указать явно, с помощью атрибута Table(name);

C#
1
2
3
4
5
[Table("Entities")]
class EntityModels
{
    .....
}

А лучше просто переименуйте сущность EntityModels в Entities



0



olegall

0 / 0 / 0

Регистрация: 27.01.2014

Сообщений: 116

20.10.2016, 11:03

 [ТС]

7

Сделал так

C#
1
2
3
4
5
[Table("Entities")]
class EntityModels
{
    .....
}

при выполнении миграций (команда Update-Database) возникает ошибка
Either the parameter @objname is ambiguous or the claimed @objtype (OBJECT) is wrong

Пробовал переименовать таблицу Entities, но новая таблица не создаётся. Не знаю что делать



0



In my case the exeception was thrown because EF had created a migration incorrectly.
It missed setting the identity: true on the second table. So go into the migrations which created the relevant tables and check if it missed to add identity.

CreateTable(
    "dbo.LogEmailAddressStats",
    c => new
        {
            Id = c.Int(nullable: false, identity: true),
            EmailAddress = c.String(),
        })
    .PrimaryKey(t => t.Id);

CreateTable(
    "dbo.LogEmailAddressStatsFails",
    c => new
        {
            Id = c.Int(nullable: false), // EF missed to set identity: true!!
            Timestamp = c.DateTime(nullable: false),
        })
    .PrimaryKey(t => t.Id)
    .ForeignKey("dbo.LogEmailAddressStats", t => t.Id)
    .Index(t => t.Id);

An Id column should have identity (i.e. auto-incrementing!) so this must be a EF bug.

You could add identity manually with SQL directly to the database but I prefer using Entity Framework.

If you run in to the same problem I see two easy solutions:

Alt 1

reverse the incorrectly created migration with

update-database -target:{insert the name of the previous migration}

Then add the identity: true manually to the migration code and then update-database again.

Alt 2

you create a new migration that adds identity. If you have no changes in the models and you run

add-migration identity_fix

it will create an empty migration. Then just add this

    public partial class identity_fix : DbMigration
    {
        public override void Up()
        {
            AlterColumn("dbo.LogEmailAddressStatsFails", "Id", c => c.Int(nullable: false, identity: true));
        }

        public override void Down()
        {
            AlterColumn("dbo.LogEmailAddressStatsFails", "Id", c => c.Int(nullable: false));
        }
    }

  • Remove From My Forums
  • Question

  • I have a super-simple screen that has one entity an a grid (that used to work).  If I try to save, using the built-in button, I get:

    «An error occurred while updating the entries. See the inner exception for details.»

    It only happens in my published Azure cloud service (not on my local machine).  I have not been able to figure out how to get the Inner Exception.  I enabled the «Enable Created/Modified Properties» and I think that it might have something
    to do with that.  I unchecked it and the problem still exists.

    I have not been able to get tracing to work (I have a separate question going on that issue) so I am trying to figure out how to get the actual error.  Any ideas on how to get the actual error would be appreciated.

    Thanks,

    Mark

Answers

  • Otis:

    I think the error was thrown by the code in the catch block because the InnerException is null.

    Yesterday, I published to Azure using a database name which did not exist.  This caused LightSwitch to create a new database which should be perfect.  Then I used the Azure migration wizard to copy data from my old database to the new one. 
    I have done this before several times and it has always worked.

    I was really expecting this to fix the problem, but it did not. 

    I finally figured it out: I had some validation code on the Client table. When I commented this out, the error went away.  This code used to work, but for some reason it is causing the error.

    The really annoying thing is that I could never get a helpful error message and I spent a lot of time trying to figure this out.

    Thanks again for your help.

    Mark

    • Marked as answer by

      Friday, August 29, 2014 1:32 PM

  • Remove From My Forums
  • Question

  • Hello All,

    Am having this error when calling SaveChanges() : An error occurred while updating the entries. See the inner exception
    for details. when use sql server profiler to inspect the query I found that Entity framework is trying to insert a value in column set as Identity in the concerned table.

    How can prevent Entity framework from inserting in that field?

    Thanks

Answers

  • Hi,

    Here you have a link explaining this attribute:

    http://www.devart.com/blogs/dotconnect/?p=5444

    The explanation was for Oracle providers, but the idea is the same for SQL Server.

    Basically, with this attribute you say to EF that this field must set its values from its corresponding database identity value.

    Best regards,

    JA Reyes.


    Please remember to Vote & «Mark As Answer» if this post is helpful to you.
    Por favor, recuerda Votar y «Marcar como respuesta» si la solución de esta pregunta te ha sido útil.

    • Marked as answer by

      Monday, September 26, 2011 6:12 AM

  • Remove From My Forums
  • Question

  • Hello All,

    Am having this error when calling SaveChanges() : An error occurred while updating the entries. See the inner exception
    for details. when use sql server profiler to inspect the query I found that Entity framework is trying to insert a value in column set as Identity in the concerned table.

    How can prevent Entity framework from inserting in that field?

    Thanks

Answers

  • Hi,

    Here you have a link explaining this attribute:

    http://www.devart.com/blogs/dotconnect/?p=5444

    The explanation was for Oracle providers, but the idea is the same for SQL Server.

    Basically, with this attribute you say to EF that this field must set its values from its corresponding database identity value.

    Best regards,

    JA Reyes.


    Please remember to Vote & «Mark As Answer» if this post is helpful to you.
    Por favor, recuerda Votar y «Marcar como respuesta» si la solución de esta pregunta te ha sido útil.

    • Marked as answer by

      Monday, September 26, 2011 6:12 AM

@csmager I can’t reproduce this—see my code below. Please attach a small, runnable project or post a small, runnable code listing that reproduces what you are seeing so that we can investigate.

@AndriySvyryd With the code below I get the following model and change tracker state. The update pipeline then attempts to insert null. Any idea what is happening here?

Model: 
  EntityType: Foo
    Properties: 
      Id (int) Required PK FK Index AfterSave:Throw ValueGenerated.OnAdd
      CurrentPeriodNumber (int?) FK Index
    Navigations: 
      CurrentPeriod (FooPeriod) ToPrincipal FooPeriod
      Periods (ICollection<FooPeriod>) Collection ToDependent FooPeriod Inverse: Foo
    Keys: 
      Id PK
    Foreign keys: 
      Foo {'Id', 'CurrentPeriodNumber'} -> FooPeriod {'FooId', 'PeriodNumber'} Unique ToPrincipal: CurrentPeriod ClientSetNull
    Indexes: 
      Id, CurrentPeriodNumber  Unique
  EntityType: FooPeriod
    Properties: 
      FooId (int) Required PK FK AfterSave:Throw
      PeriodNumber (int) Required PK AfterSave:Throw
    Navigations: 
      Foo (Foo) ToPrincipal Foo Inverse: Periods
    Keys: 
      FooId, PeriodNumber PK
    Foreign keys: 
      FooPeriod {'FooId'} -> Foo {'Id'} ToDependent: Periods ToPrincipal: Foo Cascade
Foo {Id: 0} Added
  Id: 0 PK FK
  CurrentPeriodNumber: <null> FK
  CurrentPeriod: <null>
  Periods: [{FooId: 0, PeriodNumber: 1}]
FooPeriod {FooId: 0, PeriodNumber: 1} Added
  FooId: 0 PK FK
  PeriodNumber: 1 PK
  Foo: {Id: 0}
#nullable enable

public class Foo
{
    public int Id { get; set; }
    public int? CurrentPeriodNumber { get; set; }
    public FooPeriod? CurrentPeriod { get; set; }
    public ICollection<FooPeriod> Periods { get; } = new HashSet<FooPeriod>();
}

public class FooPeriod
{
    public int FooId { get; set; }
    public int PeriodNumber { get; set; }
    public Foo? Foo { get; set; }
}

public class SomeDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
            .UseSqlServer(Your.ConnectionString)
            .LogTo(Console.WriteLine, LogLevel.Information)
            .EnableSensitiveDataLogging();

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Foo>(entity =>
        {
            entity.HasKey(x => x.Id);
            entity.Property(x => x.Id)
                .ValueGeneratedOnAdd();
            entity.HasOne(x => x.CurrentPeriod)
                .WithOne()
                .HasForeignKey<Foo>(x => new { x.Id, x.CurrentPeriodNumber });
        });

        modelBuilder.Entity<FooPeriod>(entity =>
        {
            entity.HasKey(x => new { x.FooId, x.PeriodNumber });
            entity.HasOne(x => x.Foo)
                .WithMany(x => x.Periods)
                .HasForeignKey(x => x.FooId);
        });
    }
}

public class Program
{
    public static void Main()
    {
        using (var context = new SomeDbContext())
        {
            context.Database.EnsureDeleted();
            context.Database.EnsureCreated();

            var period = new FooPeriod
            {
                PeriodNumber = 1,
                Foo = new Foo()
            };

            context.Add(period);
            context.SaveChanges();
        }
    }
}
fail: 2/21/2022 11:56:46.224 RelationalEventId.CommandError[20102] (Microsoft.EntityFrameworkCore.Database.Command)
      Failed executing DbCommand (24ms) [Parameters=[@p0=NULL (DbType = Int32)], CommandType='Text', CommandTimeout='30']
      SET NOCOUNT ON;
      DECLARE @inserted0 TABLE ([Id] int);
      INSERT INTO [Foo] ([CurrentPeriodNumber])
      OUTPUT INSERTED.[Id]
      INTO @inserted0
      VALUES (@p0);
      SELECT [i].[Id] FROM @inserted0 i;
fail: 2/21/2022 11:56:46.245 CoreEventId.SaveChangesFailed[10000] (Microsoft.EntityFrameworkCore.Update)
      An exception occurred in the database while saving changes for context type 'SomeDbContext'.
      Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while saving the entity changes. See the inner exception for details.
       ---> Microsoft.Data.SqlClient.SqlException (0x80131904): Cannot insert the value NULL into column 'Id', table 'SixOh.dbo.Foo'; column does not allow nulls. INSERT fails.
      The statement has been terminated.
         at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
         at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
         at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
         at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
         at Microsoft.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
         at Microsoft.Data.SqlClient.SqlDataReader.get_MetaData()
         at Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)
         at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean isAsync, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
         at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String method)
         at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
         at Microsoft.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)
         at Microsoft.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
         at System.Data.Common.DbCommand.ExecuteReader()
         at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
         at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
      ClientConnectionId:1c4cbf7d-e825-4b2e-b16c-ccfe8932e760
      Error Number:515,State:2,Class:16
         --- End of inner exception stack trace ---
         at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
         at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable`1 commandBatches, IRelationalConnection connection)
         at Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IList`1 entries)
         at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IList`1 entriesToSave)
         at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(StateManager stateManager, Boolean acceptAllChangesOnSuccess)
         at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.<>c.<SaveChanges>b__104_0(DbContext _, ValueTuple`2 t)
         at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
         at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess)
         at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
Unhandled exception. Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while saving the entity changes. See the inner exception for details.
 ---> Microsoft.Data.SqlClient.SqlException (0x80131904): Cannot insert the value NULL into column 'Id', table 'SixOh.dbo.Foo'; column does not allow nulls. INSERT fails.
The statement has been terminated.
   at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at Microsoft.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   at Microsoft.Data.SqlClient.SqlDataReader.get_MetaData()
   at Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)
   at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean isAsync, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
   at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String method)
   at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at Microsoft.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)
   at Microsoft.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.ExecuteReader()
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
   at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
ClientConnectionId:1c4cbf7d-e825-4b2e-b16c-ccfe8932e760
Error Number:515,State:2,Class:16
   --- End of inner exception stack trace ---
   at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable`1 commandBatches, IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IList`1 entries)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IList`1 entriesToSave)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(StateManager stateManager, Boolean acceptAllChangesOnSuccess)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.<>c.<SaveChanges>b__104_0(DbContext _, ValueTuple`2 t)
   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess)
   at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
   at Microsoft.EntityFrameworkCore.DbContext.SaveChanges()
   at Program.Main() in C:localcodeAllTogetherNowSixOhProgram.cs:line 134

We are using MVC in combination with Entity Framework.

At some point we are trying to establish a link between two entities.  This works fine in a unit-test, but gives the following error when tried from an MVC controller method:

“An error occurred while saving entities that do not expose foreign key properties for their relationships. The EntityEntries property will return null because a single entity cannot be identified as the source of the exception. Handling of exceptions while
saving can be made easier by exposing foreign key properties in your entity types. “

The (stripped down) classes:

public class Position : Entity
{
   public string Function { get; set; }
   public Organization Organization{ get; set; }
   // public Guid? OrganizationId { get; set; }
   // works when enabled!
}

public class Organization: Entity
{
   public string Name { get; set; } 
   public IList<Position> Contacts
   {
       get {return contacts;} 
       set { contacts = value; }
   }
 
   public class EntityConfiguration :
            EntityConfigurationBase<Organization>
   {
       public EntityConfiguration()
       {
           HasMany(p => p.Contacts)
               .WithOptional(y => y.Organization)
        }
   }
 
   private IList<Position> contacts = 
       new List<Position>();
}

The (stripped down) controller method that fails:

[HttpPost]
public ActionResult Edit(Position position, string organizationId = "")
{
    if (!ModelState.IsValid)
    {
        return View(position);
    }
    db.Entry(position).State = EntityState.Modified;
    if (!string.IsNullOrEmpty(organizationId))
    {
        Guid orgId = Guid.Parse(organizationId);
        Organization organization =
            db.Organizations
                .First(x => x.Id.Equals(orgId));
        position.Organization = organization;
    }
	db.SaveChanges();
    RedirectToAction("Index");
}

The unit test that passes:

[TestMethod]
public void LinkOrganizationToPositionTest()
{
    // arrange
    DbModel dbModel;
    Organization org;
    Position pos;
    Guid orgId;

    using (dbModel = new DbModel())
    {
        dbModel.Database.Delete();
        dbModel.Database.Create();

        // - first organization
        org = dbModel.Organizations.Create();
        org.Name = "TestOrgFirst";
        dbModel.Entry(org).State = EntityState.Added;

        pos = dbModel.Positions.Create();
        pos.Function = "TestFunc";
        dbModel.Entry(pos).State = EntityState.Added;

        // - link pos to first org
        pos.Organization = org;

        org = dbModel.Organizations.Create();
        org.Name = "TestOrgSecond";
        dbModel.Entry(org).State = EntityState.Added;
        orgId = org.Id;
        dbModel.SaveChanges();
    }

    // act
    // - obtain "fresh" model
    using (dbModel = new DbModel())
    {
        // - get second org
        org = dbModel.Organizations.Find(orgId);
        pos = dbModel.Positions.Find(pos.Id);
        pos.Organization = org;
        dbModel.SaveChanges();
    }

    // assert
    using (dbModel = new DbModel())
    {
        Position actual =
            dbModel.Positions
                .Include("Organization")
                    .First(x => x.Id.Equals(pos.Id));
        // - link was saved 
        Assert.AreEqual(
            "TestOrgSecond", 
            actual.Organization.Name
            );
    }
}

       


Why is the is the OrganizationId foreign key property required by the MVC?
 Is there a simple fix that doesn’t require  all the foreign-keys in the model?

This post was most recently updated on June 23rd, 2022.

2 min read.

This article offers yet another possible fix to an issue, where trying to call SaveChanges() in Entity Framework Core throws a pretty generic “An error occurred while updating the entries”-exception, and you’re left wondering what in tarnation is wrong this time.

And admittedly, that’s a really generic error, so it could pretty much be whatever. But in this article, I’ll go through one possibility – hopefully, it helps!

Problem

So I was just pushing in some new rows to an incredibly simple table in my small Azure MS SQL database when this error occurred:

An error occurred while updating the entries. See the inner exception for details.

What gives? 🤔

Reason

Huh, so the actual error message itself is extremely generic. That’s not going to be enough to help us figure this out.

The error itself doesn’t help you much. But what about the HResult, it’s bound to contain an error code, right?

Well, yes. The HResults were:

  • Exception: -2146233088 (Generic, doesn’t help us much)
  • InnerException: -2146232060 (Generic SQL Server error)

Ugh – that’s extremely generic as well! No help at all.

But wait – let’s do what it tells us to, and see the inner exception, then:

{"Cannot insert explicit value for identity column in table '[Not the table I was inserting stuff to, and not one that had any direct relations to it either]' when IDENTITY_INSERT is set to OFF.rnCannot insert explicit value for identity column in table '[Another unrelated table]' when IDENTITY_INSERT is set to OFF.rnCannot insert explicit value for identity column in table '[One more unrelated table]' when IDENTITY_INSERT is set to OFF.rnCannot insert explicit value for identity column in table '[Yet another unrelated table]' when IDENTITY_INSERT is set to OFF.rnCannot insert explicit value for identity column in table '[This one was just as unrelated]' when IDENTITY_INSERT is set to OFF."}

That’s, uhh… Not that helpful, still? What’s up with all of these errors from other tables??

Oh. Wait. The exception only contains references to other tables, not about my actual entity at all? References are going to be the key term here.

Solution

Okay – this is going to be specific to this particular case, and probably different for you, but might be worth checking out anyway.

So, I was handling some non-tracked entities earlier in the code – and was in fact trying to associate one of these entities with a new entity that I was saving.

In the code, this looks somewhat like the below:

var item = ctx.Entities.Where(x => x.Amount > 1000).AsNoTracking().First();

ctx.OtherEntities.Add(new OtherEntity(){
   Id = 0,
   Entity = item
});

ctx.SaveChanges();

Did you catch it? The item is not tracked – and you can’t associate it with a tracked entity!

So, what you need to do, is to fetch the item without.AsNoTracking() if you plan on associating it with any tracked entities.

Super simple – but the exception thrown is definitely not very informative.

In case this article didn’t help you, I have another one explaining another solution to the same error (but a different underlying issue) here:

  • Author
  • Recent Posts

mm

Antti Koskela is a proud digital native nomadic millennial full stack developer (is that enough funny buzzwords? That’s definitely enough funny buzzwords!), who works as Solutions Architect for Precio Fishbone, building delightful Digital Workplaces.

He’s been a developer from 2004 (starting with PHP and Java), and he’s been working on .NET projects, Azure, Office 365, SharePoint and a lot of other stuff. He’s also Microsoft MVP for Office Development.

This is his personal professional (e.g. professional, but definitely personal) blog.

mm

4.5
2
votes

Article Rating

Содержание

  1. Entity Framework — «Произошла ошибка при обновлении записей. Подробности см. Во внутреннем исключении» [дубликат]
  2. Обновление БД Entity Framework
  3. 2 ответа
  4. Dadaviz
  5. Ошибка An error occurred while updating — что делать
  6. Причины ошибки при загрузке обновлений
  7. Что делать при этой ошибке?
  8. Возобновляем Steam из сохранений
  9. An error occurred while updating the entries see the inner перевод
  10. Лучший отвечающий
  11. Вопрос
  12. Ответы
  13. Все ответы

Entity Framework — «Произошла ошибка при обновлении записей. Подробности см. Во внутреннем исключении» [дубликат]

У меня проблема, я только начал изучать EF Model First и какое-то время остаюсь в одной точке. У меня такая ошибка:

«Произошла ошибка при обновлении записей. Подробнее см. Внутреннее исключение»

Я создал простую модель на диаграмме, сгенерировал базу данных и написал простой код на C #, чтобы добавить только одну строку в таблицу, но ошибка появляется все время.

Я публикую снимок экрана с Diagram / Generated DLL / Simple Main / И выбросом ошибок

Включите Pluralization On . Проблема заключается в том, что вы модель объекта используют сингулярное имя ( Pupil ) соглашение, в то время как в вашей базе данных вы используете множественные имена Pupils с s .

ОБНОВИТЬ

В этом посте показано, как его можно включить или выключить. Некоторые важные выдержки из этого поста:

Включение и выключение множественного числа

В меню «Инструменты» выберите «Параметры».

В диалоговом окне Параметры разверните Инструменты для баз данных. Примечание. Выберите «Показать все параметры», если узел «Инструменты для баз данных» не отображается.

Щелкните Конструктор O / R.

Установите для параметра Pluralization of names значение Enabled = False, чтобы настроить конструктор O / R таким образом, чтобы он не изменял имена классов.

Установите для плюрализации имен значение Enabled = True, чтобы применить правила множественного числа к именам классов объектов, добавленных в конструктор O / R.

ОБНОВЛЕНИЕ 2

Но учтите, что вам следует избегать имен во множественном числе. Вы можете прочитать здесь, как это сделать (я процитирую это здесь, на случай, если ссылка сломается).

(. ) Когда вы работаете с подходом Entity Framework Code First, вы создаете таблицы базы данных из классов модели. Обычно Entity Framework создает таблицы с именами в множественном числе. это означает, что если у вас есть класс модели с именем PhoneNumber, инфраструктура Entity создаст таблицу для этого класса с именем «PhoneNumbers». Если вы хотите избежать имени во множественном числе и хотите использовать имя в единственном числе, например «Клиент», вы можете сделать это следующим образом. В своем классе DBContext переопределите метод «OnModelCreating» следующим образом (. )

(. ) Переопределение этого метода позволит избежать создания таблиц с именами во множественном числе. Теперь он создаст таблицу под названием «PhoneNumber», а не «PhoneNumbers» (. )

Источник

Обновление БД Entity Framework

Я пытаюсь обновить свою БД, чтобы добавить в нее новые заказы. Каждый заказ связан с ProductionLine и содержит его идентификатор, а затем ProductionLine. Я считаю, что это происходит, это то, что он пытается добавить в таблицу ProductionLine, но он должен только добавлять таблицу заказов. Я не уверен, как заставить его редактировать только таблицу заказов.

Я не установил неизменным свой список ProductionLine, который запрашивался в другом операторе использования. Установка его в неизменном состоянии позволяет EF знать, что ему не нужно обновлять его, что означает, что он не пытается дублировать идентификаторы.

2 ответа

Entity Framework вставляет все записи с добавленным состоянием. Таким образом, ваша сущность тоже имеет такое же состояние, что и из-за того, что она вставлена.

Вы можете установить его состояние, используя context.Entry (prodLines.Where (x => x.Id == prodLineID) .FirstOrDefault ()). State = EntityState.Unchanged;

Без изменений: сущность отслеживается контекстом и существует в базе данных, а значения ее свойств не изменились по сравнению со значениями в базе данных.

Вы можете увидеть больше информации об этом поведении в Состояния сущностей и SaveChanges

Вы уверены, что правильно настраиваете свои первичные ключи?

При добавлении public int OrderId < get; set; >к заказу
public string ProductionLineId < get; set; >на производственную линию

Я могу вставить производственную линию и ссылаться на нее из нескольких заказов.

Вы используете prodLines.Where(x => x.Id == prodLineID) , который использует свойство Id , которое не отображается в вашем классе Model.

Похоже, у вас есть свойство Id в вашем BaseEntity?

Источник

Dadaviz

Ваш IT помощник

Ошибка An error occurred while updating — что делать

Ошибка загрузки обновлений «An error occurred while updating» в Steam (для Dota 2, Counter Strike и других игр) встречается не так уж редко. Ее появление напрямую связывают с официальными обновлениями в Стим. Сами апдейты призваны не только вносить изменения в интерфейс, но и оптимизировать большое количество внутренних процессов. Игрокам данные нововведения должны помогать в игровом процессе, но не всегда все проходит гладко.

Произошла ошибка при загрузке обновлений

Причины ошибки при загрузке обновлений

Сам конфликт, как правило, возникает из-за самого клиента на компьютере пользователя. Его установка может выполняться не совсем корректно, что впоследствии мешает обновлениям интегрироваться правильно. К несчастью если файлы прервались на половине распаковки обновлений, то легко исправить ситуацию уже не получится.

Dota 2 и Counter Strike наиболее часто обновляются в приложении Steam. Именно с ними наиболее часто связана ошибка «An error occurred while updating». Проблема появляется при глобально вносимых изменениях, где обновлению подлежат сотни метров архивов. Поэтому мелкие обновления могут устанавливаться вполне себе нормально, не выявляя долгое время конфликтных ситуаций.

Что делать при этой ошибке?

Для начала рекомендуется попробовать несколько действенных советов от пользователей, которые ранее сталкивались с проблемой, и впоследствии им удалось ее решить. Проведите следующие манипуляции:

    Перейдите в корневую папку Стима и найдите там «steamapps», в ней удалите папку «downloading». После перезагрузки пробуйте пройти в папку Steam и оттуда запустить его ярлык от имени администратора;

Удалите папку «downloading» в корне Steam

  • Отключите роутер из розетки и выключите на время ПК — далее пробуйте запустить апдейт;
  • Возможны конфликтные ситуации с вашим антивирусом, добавьте Steam в исключение;
  • Может быть ситуация блокировки антивирусом непосредственно интернет-соединения, поэтому отключите его на время. Перезапустите DNS-клиент в Службах Windows.
  • Причиной оказывается отсутствие свободного места на вашем жестком диске, освободите немного пространства;
  • Откидывать перегрузки серверов тоже не стоит, попробуйте подключиться немного позже;
  • Последним вариантом среди советов остается полная деинсталляция игр Dota 2 (Counter Strike).
  • Этими решениями следует воспользоваться в первую очередь. Если все испробовали, и ничего не помогло, тогда переходите к официальным рекомендациям разработчиков.

    Возобновляем Steam из сохранений

    Стим наиболее подвержен разным родам ошибок. Поэтому компания Valve всегда предлагает своим пользователям совершать резервные копирования всех файлов утилиты. Если вы один из таких счастливчиков, которые имеют запасную копию, тогда смело пробуйте следующий вариант.

    • Выполните полное удаление всех файлов «Стима». Воспользуйтесь сторонними деинсталляторами (CCleaner, например).
    • Найдите копию «Стима» и установите на место прежней.
    • Зайдя в него в верхнем меню «Steam» вы найдете «Резервное копирование и восстановление игр». Выполните все предложенные действия и укажите путь к сохраненным играм, если их также требуется восстановить.

    Восстановление игр из созданных резервных копий

    Если на вашем ПК произошла ошибка при обновлении игр (An error occurred while updating), то стоит поочередно применить все вышеописанные методы. Также есть просьба отписаться в комментариях о результатах.

    Источник

    An error occurred while updating the entries see the inner перевод

    Лучший отвечающий

    Вопрос

    I have a super-simple screen that has one entity an a grid (that used to work). If I try to save, using the built-in button, I get:

    «An error occurred while updating the entries. See the inner exception for details.»

    It only happens in my published Azure cloud service (not on my local machine). I have not been able to figure out how to get the Inner Exception. I enabled the «Enable Created/Modified Properties» and I think that it might have something to do with that. I unchecked it and the problem still exists.

    I have not been able to get tracing to work (I have a separate question going on that issue) so I am trying to figure out how to get the actual error. Any ideas on how to get the actual error would be appreciated.

    Ответы

    I think the error was thrown by the code in the catch block because the InnerException is null.

    Yesterday, I published to Azure using a database name which did not exist. This caused LightSwitch to create a new database which should be perfect. Then I used the Azure migration wizard to copy data from my old database to the new one. I have done this before several times and it has always worked.

    I was really expecting this to fix the problem, but it did not.

    I finally figured it out: I had some validation code on the Client table. When I commented this out, the error went away. This code used to work, but for some reason it is causing the error.

    The really annoying thing is that I could never get a helpful error message and I spent a lot of time trying to figure this out.

    Thanks again for your help.

    Все ответы

    I added a «TestSave» button that executes:

    This is supposed to return all inner exceptions, but here is what I get:

    Microsoft.LightSwitch.DataServiceOperationException: An error occurred while updating the entries. See the inner exception for details.
    at Microsoft.LightSwitch.Framework.Base.ExecutableObject.Execute(Boolean allowJoin)
    at Microsoft.LightSwitch.Framework.Base.ExecutableObject.Execute()
    at Microsoft.LightSwitch.Details.Framework.Base.MethodInvocation`2.Execute()
    at Microsoft.LightSwitch.Framework.Client.ScreenObject`2.Save()
    at LightSwitchApplication.ManageClients.SaveTest_Execute()

    I still can’t tell what the error is. This is a big problem for me. Anyone have any ideas?

    I hope you dont think I am teaching Granny how to suck eggs, but the error message says to see the Inner Exception so why dont you do the following code?

    This wil at least allow you to see the inner exception.

    If you found this post helpful, please mark it as helpful. If by some chance I answered the question, please mark the question as answered. That way you will help more people like me 🙂

    Thanks for the suggestion. I tried your code and I get this:

    «An error occurred while running the command.
    Error details: Object reference not set to an instance of an object.»

    It looks like there is no inner exception. This is driving me crazy.

    Im slightly confused. I would have expected the code to have shown a message box that would have said something like:-

    An Error has occured
    Error Message: An error occured while updating the entries. See inner exception for details
    Inner Exception: Object reference not set to an instance of an object

    If you did get this then the Inner exception is the «Object reference not set to an instance of an object» line that you have been looking for. I am not sure if it was just a copypaste error but shouldn’t the save be this.Save();

    As an aside, when I have had the Object reference error in the past it is when there is a required field missing a value or you are trying to set a value to something that doesnt exist. I would just check the code that does the updates before the save to see that you are getting everything

    If you found this post helpful, please mark it as helpful. If by some chance I answered the question, please mark the question as answered. That way you will help more people like me 🙂

    I really appreciate your help. There is no code in the screen; it just has one entity and a grid. I did make some manual changes directly to the database, so that’s probably causing the problem, but I just can’t tell exactly what it is.

    Here is the code where I am trying to catch the inner exception:

    An error occurred while running the command.
    Error details: Object reference not set to an instance of an object.

    This is coming from LightSwitch and not my message. I think that it means that the ex.InnerException is null.

    So, it looks like there is no inner exception. I am starting to rebuild the database. I am not sure what else to do.

    Also, from what I have read, Exception.ToString should return info on InnerExceptions if it exists:

    «The default implementation of ToString obtains the name of the class that threw the current exception, the message, the result of calling ToString on the inner exception, and the result of calling EnvironmentStackTrace. If any of these members is , its value is not included in the returned string.

    If there is no error message or if it is an empty string («»), then no error message is returned. The name of the inner exception and the stack trace are returned only if they are not .»

    Источник

    I cannot tell you how many times I’ve had the following conversation

    “Hey I’m getting an error”

    “What’s the error?”

    “DBUpdateException”

    “OK, what’s the message though, that could be anything”

    “ahhh.. I didn’t see…..”

    Frustratingly, When doing almost anything with Entity Framework including updates, deletes and inserts, if something goes wrong you’ll be left with the generic exception of :

    Microsoft.EntityFrameworkCore.DbUpdateException: ‘An error occurred while saving the entity changes. See the inner exception for details.’

    It can be extremely annoying if you’re wanting to catch a particular database exception (e.g. It’s to be expected that duplicates might be inserted), and handle them in a different way than something like being unable to connect to the database full stop. Let’s work up a quick example to illustrate what I mean.

    Let’s assume I have a simple database model like so :

    class BlogPost
    {
        public int Id { get; set; }
        public string PostName { get; set; }
    }
    

    And I have configured my entity to have a unique constaint meaning that every BlogPost must have a unique name :

    modelBuilder.Entity<BlogPost>()
        .HasIndex(x => x.PostName)
        .IsUnique();
    

    If I do something as simple as :

    context.Add(new BlogPost
    {
        PostName = "Post 1"
    });
    
    context.Add(new BlogPost
    {
        PostName = "Post 1"
    });
    
    context.SaveChanges();
    

    The *full* exception would be along the lines of :

    Microsoft.EntityFrameworkCore.DbUpdateException: ‘An error occurred while saving the entity changes. See the inner exception for details.’
    Inner Exception
    SqlException: Cannot insert duplicate key row in object ‘dbo.BlogPosts’ with unique index ‘IX_BlogPosts_PostName’. The duplicate key value is (Post 1).

    Let’s say that we want to handle this exception in a very specific way, for us to do this we would have to have a bit of a messy try/catch statement :

    try
    {
        context.SaveChanges();
    }catch(DbUpdateException exception) when (exception?.InnerException?.Message.Contains("Cannot insert duplicate key row in object") ?? false)
    {
        //We know that the actual exception was a duplicate key row
    }
    

    Very ugly and there isn’t much reusability here. If we want to catch a similar exception elsewhere in our code, we’re going to be copy and pasting this long catch statement everywhere.

    And that’s where I came across the EntityFrameworkCore.Exceptions library!

    Using EntityFrameworkCore.Exceptions

    The EntityFrameworkCore.Exceptions library is extremely easy to use and I’m actually somewhat surprised that it hasn’t made it’s way into the core EntityFramework libraries already.

    To use it, all we have to do is run the following on our Package Manager Console :

    Install-Package EntityFrameworkCore.Exceptions.SqlServer
    

    And note that there are packages for things like Postgres and MySQL if that’s your thing!

    Then with a single line for our DB Context we can set up better error handling :

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseExceptionProcessor();
    }
    

    If we run our example code from above, instead of our generic DbUpdateException we get :

    EntityFramework.Exceptions.Common.UniqueConstraintException: ‘Unique constraint violation’

    Meaning we can change our Try/Catch to be :

    try
    {
        context.SaveChanges();
    }catch(UniqueConstraintException ex)
    {
        //We know that the actual exception was a duplicate key row
    }
    

    Much cleaner, much tidier, and far more reusable!

    Понравилась статья? Поделить с друзьями:
  • An error occurred while running the simulation and the simulation was terminated
  • An error occurred while running the manifest extension utility to sign the smtp data
  • An error occurred while running registry sysprep dlls halting sysprep execution dwret 0x3cf2
  • An error occurred while retrieving the requested logs openshift
  • An error occurred while restoring the basesystem image to the target volume