Warum setzt Entity Framework meine Enumeration beim Speichern auf den Standardwert zurück?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Warum setzt Entity Framework meine Enumeration beim Speichern auf den Standardwert zurück?

Post by Anonymous »

Ich debugge das folgende verwirrende Verhalten. Ich habe eine Entität „ExampleEntity, die eine [Erforderlich]-Enumeration enthält, die aus Migrationsgründen einen Standardwert hat. Beim Einfügen einer neuen BeispielEntität gebe ich den Wert an, den dieses Feld annehmen soll. Eine Überprüfung im Debugger zeigt, dass der Wert in der lokalen Version des DbSet korrekt festgelegt wurde. Wenn ich jedoch SaveChanges() für den Kontext aufrufe, wird der Enums-Wert auf den konfigurierten Standardwert zurückgesetzt.
Die Modelle:

Code: Select all

public enum ExampleEnum
{
Mecury,
Venus,
Earth,
Mars
}

internal class ExampleEntity
{
public int id { get; set; }

[Required]
public ExampleEnum Val { get; set; }
}

internal class EFContext : DbContext
{
public EFContext(DbContextOptions options) : base(options)
{
}

public virtual DbSet Ents { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity(entity =>
{
entity.Property(e => e.Val).HasDefaultValue(ExampleEnum.Earth);
});
}
}
Der Testcode:

Code: Select all

class Program
{
private static DbConnection CreateInMemoryDatabase()
{
var connection = new SqliteConnection("Filename=:memory:");
connection.Open();
return connection;
}

static void Main(string[] args)
{
var ContextOptions = new DbContextOptionsBuilder()
.UseSqlite(CreateInMemoryDatabase())
.Options;

using (var context = new EFContext(ContextOptions))
{
context.Database.EnsureDeleted();
context.Database.EnsureCreated();
}

using (var db = new EFContext(ContextOptions))
{
var newEntity = new ExampleEntity
{
Val = ExampleEnum.Mecury,
};
db.Ents.Add(newEntity);
db.SaveChanges();
}

using (var db = new EFContext(ContextOptions))
{
var savedEnt = db.Ents.First();
Console.WriteLine(savedEnt.Val.ToString());
}
}
}
Ich habe erwartet, dass der gedruckte Wert Merkur ist, aber es wird die konfigurierte Standarderde ausgegeben. Ich kann dieses Problem beheben, indem ich nach dem Speichern der Änderungen den Val auf den gewünschten Wert setze:

Code: Select all

var newEntity = new ExampleEntity
{
Val = ExampleEnum.Mecury,
};
db.Ents.Add(newEntity);
db.SaveChanges();
newEnttity.Val = ExampleEnum.Mecury;
db.SaveChanges()

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post