【发布时间】:2022-02-23 15:20:04
【问题描述】:
我正在调试以下令人费解的行为。我有一个实体ExampleEntity,其中包含一个[Required] 枚举,出于迁移原因,它有一个默认值。插入新的ExampleEntity 时,我指定了该字段应采用的值。在调试器中检查显示该值已在 DbSet 的本地版本中正确设置。但是,每当我在上下文中调用 SaveChanges() 时,枚举值都会重置为配置的默认值。
模型:
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<ExampleEntity> Ents { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ExampleEntity>(entity =>
{
entity.Property(e => e.Val).HasDefaultValue(ExampleEnum.Earth);
});
}
}
测试代码:
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<EFContext>()
.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());
}
}
}
我希望打印的值是Mercury,但它会打印出配置的默认值Earth。我可以在保存更改后解决此问题,将 Val 设置为所需的值:
var newEntity = new ExampleEntity
{
Val = ExampleEnum.Mecury,
};
db.Ents.Add(newEntity);
db.SaveChanges();
newEnttity.Val = ExampleEnum.Mecury;
db.SaveChanges()
【问题讨论】:
标签: c# entity-framework entity-framework-core