如何使用Entity Framework Core在具有defaut值的布爾值上設置另一個值?

boolean c# default-constraint entity-framework-core sql-server

我在這個問題中遇到了同樣的問題: 如何在插入新實體時覆蓋布爾值上的SQL Server默認值約束? [關閉]

像他一樣,我從客戶端到控制器得到了我的布爾值,false,但是通過調用_context.SaveChanges();將其設置為true _context.SaveChanges();因為Entity Framework和數據庫中的默認值約束。

但是:我正在使用實體框架核心,我沒有任何[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#boolean和SQL位,並且始終採用默認值。有人有問題強迫虛假價值嗎?

一般承認的答案

最後,我可以使用EF命令中的--data-annotations選項在我的EF模型中生成數據註釋。所以我將[DatabaseGenerated(DatabaseGeneratedOption.None)]放在屬性上,不要使用數據庫的默認約束。


熱門答案

我認為您不能使用註釋設置默認值。但是,在我自己研究這個問題之後,我發現了一個相當棘手的解決方法

如果你將bool值設置為可以為空,那麼使用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);

將新記錄插入數據庫時,不需要在對象聲明中指定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();


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因