我在这个问题上遇到了同样的问题:插入新实体时,如何覆盖布尔值上的SQL Server默认值约束?[关闭]
和他一样,我从客户端到控制器获得布尔值的良好值,false,但由于实体框架和数据库中的默认值约束,通过调用_context.SaveChanges();
将其设置为true。
但是:我使用的是实体框架核心,我没有任何[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
注释可以删除来解决这个问题。
在我的ApplicationDbContext.cs:中
modelBuilder.Entity<myEntity>(entity =>
{
entity.Property(e => e.Active).HasDefaultValueSql("1");
//entity.Property(e => e.Active).HasDefaultValueSql<bool>("1"); // doesn't fix
...
}
在我的数据库中:
CREATE TABLE myEntity(
Id INTEGER IDENTITY(1,1) NOT NULL,
...
Active BIT NOT NULL CONSTRAINT DF_myEntity_Active DEFAULT 1
);
在我的控制器中:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id, Active, etc.")] Entity myEntity)
{
if (ModelState.IsValid)
{
_context.Add(myEntity); // here myEntity.Active = false
await _context.SaveChangesAsync();
// same problem with _context.SaveChanges(); in another controller
// here myEntity.Active = true
}
...
}
EF似乎没有正确地将C#布尔值与SQL位映射,并且总是采用默认值。是否有人提出强制使用错误值的问题?
我不认为可以使用注释设置默认值。然而,在自己研究了这个问题后,我发现了一个相当棘手的解决方法。
如果您将bool值设置为可以为null,然后使用fluent api设置默认值,那么应该没问题。它并不完美,但它有效:
public class Year
{
public int Id { get; set; }
public string label { get; set; }
public int year { get; set; }
public bool? active { get; set; }
}
然后,在您的数据上下文中,设置默认值:
modelBuilder.Entity<Year>()
.Property("active")
.HasDefaultValue(true);
在数据库中插入新记录时,不需要在对象声明中指定布尔属性。下面,2017年的默认值为true。
var newYears = new List<Year>();
newYears.Add(new Year { label = "2019", year = 2019, active = false });
newYears.Add(new Year { label = "2018", year = 2018, active = true });
newYears.Add(new Year { label = "2017", year = 2017});
_context.Years.AddRange(newYears);
_context.SaveChanges();
我也遇到过类似的问题,布尔值可以为null。我在Sqlite数据库上使用EF。对我来说,数据库中没有反映更新值true/false。在我重写了OnModelCreating方法并将属性配置为以下之后
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>()
.Property(p => p.IsActive).ValueGeneratedNever().HasDefaultValue(null);
}
在此之后,由于值按预期进行了更新,因此进行了更改。希望这也能对你有所帮助。
最后,我可以使用EF命令中的--data-annotations
选项在EF模型中生成数据注释。所以我把[DatabaseGenerated(DatabaseGeneratedOption.None)]
放在属性上,不使用数据库的默认约束。