Entity Framework Core add () verursacht AusnahmeC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Entity Framework Core add () verursacht Ausnahme

Post by Anonymous »

Arbeiten in einer .NET 8 -App mit Entity Framework Core Tools V8.0.16 (gleiche gilt für 8.0.6 und 8.0.11). < /p>
Dies ist meine Entität: < /p>

Code: Select all

public class Channel
{
public string Code { get; protected set; }
public string Name { get; protected set; }
public int RegionId { get; protected set; }
public bool SubscribeToIngressFlag { get; protected set; }

public IReadOnlyCollection ChannelCurrencies => _channelCurrencies;
private List _channelCurrencies;

public IReadOnlyCollection ChannelRegions => _channelRegions;
private List _channelRegions;

protected Channel()
{
_channelCurrencies = new List();
_channelRegions = new List();
}

private Channel(int channelId, string channelCode, string name, int regionId, IEnumerable channelCurrencies, IEnumerable channelRegions, bool subscribeToIngressFlag)
{
Id = channelId;
Code = channelCode;
Name = name;
RegionId = regionId;
SubscribeToIngressFlag = subscribeToIngressFlag;

_channelCurrencies = channelCurrencies.Select(x => ChannelCurrency.Create(Id, x.CurrencyCode).Value).ToList();
_channelRegions = channelRegions.Select(region => ChannelRegion.Create(Id, region.RegionId).Value).ToList();
}

public static Result Create(int channelId, string channelCode, string name, int regionId, IEnumerable channelCurrencies, IEnumerable channelRegions, bool subscribeToIngressFlag)
{
var channel = new Channel(channelId, channelCode, name, regionId, channelCurrencies, channelRegions, subscribeToIngressFlag);
return Result.Ok(channel);
}
}
< /code>
untergeordnete Objekte sind einfach: < /p>
public class ChannelCurrencyDto : IEquatable
{
public string CurrencyCode { get; set; }

// IEquatable implementation
}

public class ChannelRegionDto : IEquatable
{
public int RegionId { get; set; }

// IEquatable implementation
}
< /code>
Die Entitätsspezifikationen verwendet den fließenden Ansatz: < /p>
public class ChannelConfiguration : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.Ignore(p => p.DomainEvents);

builder.HasKey(p => p.Id);

builder.Property(p => p.Id)
.IsRequired()
.ValueGeneratedNever();

builder.Property(p => p.Code)
.IsRequired()
.HasMaxLength(50);

builder.Property(e => e.Name)
.HasMaxLength(200)
.IsRequired();

builder.HasOne()
.WithMany()
.HasForeignKey(x => x.RegionId);

var channelCurrencyNavigation = builder.Metadata.FindNavigation(nameof(Channel.ChannelCurrencies));
channelCurrencyNavigation.SetPropertyAccessMode(PropertyAccessMode.Field);

var channelRegionNavigation = builder.Metadata.FindNavigation(nameof(Channel.ChannelRegions));
channelRegionNavigation.SetPropertyAccessMode(PropertyAccessMode.Field);

builder.HasMany(p => p.ChannelCurrencies)
.WithOne()
.HasForeignKey(x => x.ChannelId)
.IsRequired();

builder.HasMany(p => p.ChannelRegions)
.WithOne()
.HasForeignKey(x => x.ChannelId)
.IsRequired();

builder.HasIndex(x => new { x.Code })
.IncludeProperties(x => new { x.Name, x.RegionId, x.Id })
.IsUnique();

builder.Property(x =>  x.SubscribeToIngressFlag);
}
}
< /code>
Ich habe einen Seeding -Prozess, der neue Entitäten erstellen soll < /p>
foreach (var seedChannel in _seedChannels)
{
var channelToAdd = Channel.Create(
seedChannel.ChannelId,
seedChannel.ChannelCode,
seedChannel.ChannelName,
seedChannel.RegionId,
new List()
{
new ChannelCurrencyDto() { CurrencyCode = seedChannel.CurrencyCode }
},
new List()
{
new ChannelRegionDto() { RegionId = seedChannel.RegionId }
},
seedChannel.SubscribeToIngressFlag
).Value;

var dbContext = scope.ServiceProvider.GetRequiredService
();

var changeTrackerEntries1 = dbContext.ChangeTracker.Entries().ToList();
string changeTrackState1 =
JsonConvert.SerializeObject(changeTrackerEntries1.Select(
e => e.ToString()), Formatting.Indented);
_logger.LogInformation(
"ChangeTractker.Entries {ChangeTrackerEntries}", changeTrackState1);
channelRepository.Add(channelToAdd);

await dbContext.SaveEntitiesAsync(cancellationToken);
}
< /code>
Das [url=viewtopic.php?t=20324]Problem[/url] ist, dass die Ausführung dieser Zeile: < /p>
ausführtchannelRepository.Add(channelToAdd);
< /code>
, was diese Ausnahme verursacht: < /p>

 System.inValidoperationException: Die Instanz des Entitätstyps 'Kanal' kann nicht verfolgt werden, da eine andere Instanz mit demselben Schlüsselwert für {'Code'} bereits verfolgt wird. Stellen Sie beim Anbringen vorhandener Entitäten sicher, dass nur eine Entitätsinstanz mit einem bestimmten Schlüsselwert beigefügt ist. /> < /li>
  Der Fehler tritt in der Serverumgebung auf, aber es kommt nicht in der lokalen Entwicklerumgebung auf < /p>
< /li>
 ChangeTracker.Entries
hat diese Werte (basierend auf der Protokollierung im obigen Code):
"Channel {Id: 111111} Modified AK {Code: AAAAAAAAAA} FK {RegionId: 444}",
"Channel {Id: 2222} Unchanged AK {Code: BBBBBB} FK {RegionId: 222}",
"Channel {Id: 333333} Unchanged AK {Code: CCCCCCCCC} FK {RegionId: 888}",
"Channel {Id: 444444} Unchanged AK {Code: DDDDDDDDDDD} FK {RegionId: 222}"
< /code>
< /li>
< /ul>
Es scheint also, als würde EF Core irgendwie durch die Entitätsdefinition selbst verwirrt, anstatt tatsächlich auf einen doppelten Datensatz zu schlagen. < /p>
Gibt es ein Problem mit der Entitätsdefinition? Was ist es?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post