Обновление объекта в базе данных завершается с ошибкой: «Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException».C#

Место общения программистов C#
Ответить
Anonymous
 Обновление объекта в базе данных завершается с ошибкой: «Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException».

Сообщение Anonymous »

Я пытаюсь обновить существующий BusinessPartner из базы данных, но у меня не получается

"Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException"

Я добавил:

Код: Выделить всё

[Timestamp]
public byte[] Version { get; set; } // optimistic concurrency
Я записал соответствующий код:
DBCOntext:

Код: Выделить всё

   public class DbTestingCSharp : DbContext
{
public DbSet BusinessPartners { get; set; }
public DbSet BPLayerXScrapers { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=...;Database=...;...;MultipleActiveResultSets=True");
}

public DbTestingCSharp()
{

}

// DI? Auf jeden Fall in Controller
public DbTestingCSharp(DbContextOptions options) : base(options)
{

}

}

Структура данных

Код: Выделить всё

public class BusinessPartner
{
[Key]
public Guid Id { get; set; } = Guid.NewGuid();

private string _name = String.Empty;
[Required, MaxLength(200)]
public string Name
{
get { return _name; }
set { _name = value.Length > 200 ? value.Substring(0, 200) : value; }
}

public EProductLifeCycleTyp EProductLifeCycle { get; set; } = EProductLifeCycleTyp.None;
public ESource ESource { get; set; }
public EBusinessPartner EBusinessPartner { get; set; }
public string BusinessScope { get; set; } = String.Empty;
public string CommercialRegisterNumber { get; set; } = String.Empty;
public string Description { get; set; } = String.Empty;
public string Website { get; set; } = String.Empty;

public virtual List BPLayerXScrapers { get; set; } = new List();

[Required]
public DateTime TimeStampCreated { get; set; } = DateTime.UtcNow;
public DateTime? TimeStampUpdated { get; set; }

[Timestamp]
public byte[] Version { get; set; } // optimistic concurrency
}

public class BPLayerXScraper
{
[Key]
public Guid Id { get; set; } = Guid.NewGuid();

//Hash-value, if something changed? Naja, kann ich ja machen schadet ja nicht
public string Hash { get; set; }

public int LinksOnTheLandingPage { get; set; }

public string Heading { get; set; }
public string Text { get; set; }

public string URL { get; set; }

public int Layer { get; set; }

[NotMapped]
public List Links { get; set; } = new List();

[Required]
public DateTime TimeStampCreated { get; set; } = DateTime.UtcNow;
public DateTime? TimeStampUpdated { get; set; }

public BPLayerXScraper()
{

}

public BPLayerXScraper(string websiteUrl)
{
URL = websiteUrl;
}

}
Попробуйте обновить существующий объект:

Код: Выделить всё

try
{
var businessPartner = dbTarget.BusinessPartners
.Include(bp => bp.BPLayerXScrapers)
.FirstOrDefault(bp => bp.Name == name);

if (businessPartner == null)
{
throw new KeyNotFoundException("BusinessPartner not found.");
}

if (businessPartner == null)
{
Console.WriteLine("BusinessPartner not found.");
return; // Or handle the absence of BusinessPartner accordingly
}

BPLayerXScraper newScraper = new BPLayerXScraper
{
Hash = "abc123",
LinksOnTheLandingPage = 10,
Heading = "Fantasy Heading",
Text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
URL = "https://example.com",
Layer = 3,
Links = new List { "https://example.com/link1", "https://example.com/link2"  },
TimeStampCreated = DateTime.UtcNow,
TimeStampUpdated = DateTime.UtcNow.AddDays(1)
};

// Adding the new scraper to the BusinessPartner's collection of scrapers
businessPartner.BPLayerXScrapers.Add(newScraper);

// Saving changes in the database
dbTarget.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
Console.WriteLine("A concurrency conflict occurred. Handling...");

// Handling concurrency exception specifically for updates to BPLayerXScrapers or BusinessPartner
foreach (var entry in ex.Entries)
{
var databaseValues = entry.GetDatabaseValues();
if (databaseValues != null)
{
entry.OriginalValues.SetValues(databaseValues);
}
else
{
// It hits here, even the object is presented in the database
Console.WriteLine("The object was deleted from the database.");
}
}

dbTarget.SaveChanges();
}
catch (Exception e)
{
Console.WriteLine($"An error occurred: {e.Message}");
}

It fails with:

Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: 'The
database operation was expected to affect 1 row(s), but actually
affected 0 row(s); data may have been modified or deleted since
entities were loaded. See
https://go.microsoft.com/fwlink/?LinkId=527962 for information on
understanding and handling optimistic concurrency exceptions.'

Logging:

dbug: 20.04.2024 09:29:06.184 CoreEventId.SaveChangesStarting[10004] (Microsoft.EntityFrameworkCore.Update)
SaveChanges starting for 'DbTestingCSharp'.
dbug: 20.04.2024 09:29:06.187 CoreEventId.DetectChangesStarting[10800] (Microsoft.EntityFrameworkCore.ChangeTracking)
DetectChanges starting for 'DbTestingCSharp'.
dbug: 20.04.2024 09:29:06.205 CoreEventId.CollectionChangeDetected[10804] (Microsoft.EntityFrameworkCore.ChangeTracking)
1 entities were added and 0 entities were removed from navigation 'BusinessPartner.BPLayerXScrapers'. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see key values.
dbug: 20.04.2024 09:29:06.231 CoreEventId.ForeignKeyChangeDetected[10803] (Microsoft.EntityFrameworkCore.ChangeTracking)
The foreign key property 'BPLayerXScraper.BusinessPartnerId' was detected as changed. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see property values.
dbug: 20.04.2024 09:29:06.237 CoreEventId.StartedTracking[10806] (Microsoft.EntityFrameworkCore.ChangeTracking)
Context 'DbTestingCSharp' started tracking 'BPLayerXScraper' entity. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see key values.
dbug: 20.04.2024 09:29:06.240 CoreEventId.DetectChangesCompleted[10801] (Microsoft.EntityFrameworkCore.ChangeTracking)
DetectChanges completed for 'DbTestingCSharp'.
dbug: 20.04.2024 09:29:06.273 RelationalEventId.ConnectionOpening[20000] (Microsoft.EntityFrameworkCore.Database.Connection)
Opening connection to database 'xTesting' on server 'xxxx'.
dbug: 20.04.2024 09:29:06.275 RelationalEventId.ConnectionOpened[20001] (Microsoft.EntityFrameworkCore.Database.Connection)
Opened connection to database 'xTesting' on server 'xxxx'.
dbug: 20.04.2024 09:29:06.277 RelationalEventId.CommandCreating[20103] (Microsoft.EntityFrameworkCore.Database.Command)
Creating DbCommand for 'ExecuteReader'.
dbug: 20.04.2024 09:29:06.279 RelationalEventId.CommandCreated[20104] (Microsoft.EntityFrameworkCore.Database.Command)
Created DbCommand for 'ExecuteReader' (1ms).
dbug: 20.04.2024 09:29:06.280 RelationalEventId.CommandInitialized[20106] (Microsoft.EntityFrameworkCore.Database.Command)
Initialized DbCommand for 'ExecuteReader' (2ms).
dbug: 20.04.2024 09:29:06.282 RelationalEventId.CommandExecuting[20100] (Microsoft.EntityFrameworkCore.Database.Command)
Executing DbCommand [Parameters=[@p9='?' (DbType = Guid), @p0='?' (DbType = Guid), @p1='?' (Size = 4000), @p2='?' (Size = 4000), @p3='?' (DbType = Int32), @p4='?' (DbType = Int32), @p5='?' (Size = 4000), @p6='?' (DbType = DateTime2), @p7='?' (DbType = DateTime2), @p8='?' (Size = 4000)], CommandType='Text', CommandTimeout='30']
SET IMPLICIT_TRANSACTIONS OFF;
SET NOCOUNT ON;
UPDATE [BPLayerXScrapers] SET [BusinessPartnerId] = @p0, [Hash] = @p1, [Heading] = @p2, [Layer] = @p3, [LinksOnTheLandingPage] = @p4, [Text] = @p5, [TimeStampCreated] = @p6, [TimeStampUpdated] = @p7, = @p8 OUTPUT 1 WHERE [Id] = @p9; info: ... orkcore-db
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»