繁体   English   中英

如何使用Entity Framework Core在具有defaut值的布尔值上设置另一个值?

[英]How to set another value on a boolean with defaut value with Entity Framework Core?

我在此问题中遇到了完全相同的问题: 插入新实体时,如何在布尔值上覆盖SQL Server默认值约束? [关闭]

像他一样,我从客户端到控制器都获得了布尔值的好值,为false,但是通过调用_context.SaveChanges();将其设置为true _context.SaveChanges(); 由于实体框架和数据库中的默认值约束。

但是:我使用的是Entity Framework Core,但是没有任何[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位正确映射,并且始终采用默认值。 有人会强迫假值吗?

我认为您不能使用注释设置默认值。 但是,在我自己研究此问题后,我发现了一个相当棘手的解决方法

如果将布尔值设置为可为空,则使用流畅的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);

在将新记录插入数据库时​​,无需在对象声明中指定boolean属性。 下面,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();

最后,我可以使用EF命令中的--data-annotations选项在EF模型中生成数据注释。 因此,我将[DatabaseGenerated(DatabaseGeneratedOption.None)]放在属性上,并且不使用数据库的默认约束。

我也曾遇到过与null布尔值几乎类似的问题。 我在Sqlite数据库上使用EF。 对我来说,更新值true / false没有反映在数据库中。 重写OnModelCreating方法并按如下所示配置属性后

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MyEntity>()
        .Property(p => p.IsActive).ValueGeneratedNever().HasDefaultValue(null);
    }

在此之后,值将按预期进行更新。 希望这对您也有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM