Entity Framework Coreを使用してブール値に別の値を設定する方法

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

質問

私はこの質問で全く同じ問題を抱えています新しいエンティティを挿入するときにブール値でSQL Serverのデフォルト値の制約をオーバーライドする方法は? [閉まっている]

彼と同様に、私はクライアントからコントローラーへのブール値の良い値を取得しますが、falseですが、 _context.SaveChanges();呼び出しによってtrueに設定されます_context.SaveChanges(); Entity Frameworkとデータベースの既定値の制約が原因です。

しかし、私は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ビットで正しくマップせず、常にデフォルト値をとるようです。誰かが偽りの価値を強制する問題を抱えていますか?

受け入れられた回答

最後に、EFコマンドで--data-annotationsオプションを使用して、EFモデルでデータアノテーションを生成できます。ですから、私は[DatabaseGenerated(DatabaseGeneratedOption.None)]をプロパティに置き、データベースのデフォルトの制約を使用しません。


人気のある回答

注釈でデフォルト値を設定できるとは思いません。しかし、私は自分自身でこの問題を研究した後、やや難解な回避策を見つけました。

boolの値をnullに設定した場合は、流暢な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は合法ですか? はい、理由を学ぶ