gpt4 book ai didi

c# - EF Core 5 HasDefaultValue 问题,当值设置为 .Net 类型默认值时,ef 推送默认值

转载 作者:行者123 更新时间:2023-12-05 01:56:36 40 4
gpt4 key购买 nike

我在使用 Entity Framework 核心插入具有默认值列的记录时遇到了一个奇怪的问题。有没有其他方法可以获得预期的行为,我是否遗漏了一些愚蠢的东西?

tldr:将 int 属性设置为 0 或 bool 为 true 会导致使用默认值新字符串的 string.empty 给出了一个 ORA-01400: cannot insert NULL (这似乎是一个 oracle 的东西)

场景:使用迁移添加新列并添加新记录会导致正常行为(插入默认值)

仅添加新记录 oldField supplied= OK“ID”:6,“OLDFIELD”:“ef test 1”,“NEWINT”:5,“NEWSTRING”:“def”,“NEWBOOLFALSE”:0,“NEWBOOLTRUE”:1

添加一个不同于 .Net 默认值的值也可以“ID”:12,“OLDFIELD”:“ef test all set”,“NEWINT”:42,“NEWSTRING”:“此处为字符串”,“NEWBOOLFALSE”:1,“NEWBOOLTRUE”:1

现在的问题当您为 int 指定 0 而为 bool 指定 false 时

var test = new TestDef()
{
OldField = "ef bad test",
NewInt = 0,
NewBoolFalse = false,
NewBoolTrue = false
};
_womaDbContext.Add(test);
await _womaDbContext.SaveChangesAsync();

你得到 “ID”:36,“OLDFIELD”:“ef bad test”,“NEWINT”:5,“NEWSTRING”:“def”,“NEWBOOLFALSE”:0,“NEWBOOLTRUE”:1

NewString = string.Empty 报oracle异常ORA-01400: cannot insert NULL(这好像是oracle的东西)

插入查询正常工作

INSERT INTO WOMA_SCHEMA.TESTDEF
(ID, OLDFIELD, NEWINT, NEWBOOLFALSE, NEWBOOLTRUE)
VALUES("WOMA_SCHEMA"."ISEQ$$_42048".nextval, 'sql empty',0, 0,0);

这使得在不进行更新的情况下无法在 NEWBOOLTRUE 中插入假值或在 NEWINT 中插入 0

测试类(DbContext OnModelCreating 调用 TestDef.OnModelCreating(modelBuilder)):

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;

namespace Test.Model
{
[Table("TESTDEF")]
public class TestDef
{
[Column("ID")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }

[Column("OLDFIELD")]
public string OldField { get; set; }

[Required]
[Column("NEWINT")]
public int NewInt { get; set; }

[Required]
[Column("NEWSTRING")]
public string NewString { get; set; }

[Required]
[Column("NEWBOOLTRUE")]
public bool NewBoolTrue { get; set; }

[Required]
[Column("NEWBOOLFALSE")]
public bool NewBoolFalse { get; set; }

public static void OnModelCreating(ModelBuilder modelBuilder)
{
// Default values
modelBuilder
.Entity<TestDef>()
.Property(e => e.NewInt)
.HasDefaultValue(5);

modelBuilder
.Entity<TestDef>()
.Property(e => e.NewString)
.HasDefaultValue("def");

modelBuilder
.Entity<TestDef>()
.Property(e => e.NewBoolTrue)
.HasDefaultValue(true);

modelBuilder
.Entity<TestDef>()
.Property(e => e.NewBoolFalse)
.HasDefaultValue(false);
}
}
}

最佳答案

这是众所周知的 EF Core 默认值行为/缺陷,因为具有 CLR 默认值的属性(数字为 0,boolfalseDateTime.Empty 等)不作为插入命令的一部分发送,因此服务器应用配置的默认值。

在 EFC 5.0 之前,除了不使用数据库默认值外没有其他解决方案。从 EFC 5.0 开始,解决方法是使用可为空的支持字段,如 Using nullable backing fields 中所述。 , Nullable backing fields for bool propertiesSchema defaults only文档主题(奇怪地隐藏在 Working with default values 部分的 Additional Change Tracking Features 部分)。

所以想法是为这些属性使用可为空的支持字段,例如

private int? _newInt;
[Required]
[Column("NEWINT")]
public int NewInt { get => _newInt ?? 0; set => _newInt = value; }

private bool? _newBoolTrue;
[Required]
[Column("NEWBOOLTRUE")]
public bool NewBoolTrue { get => _newBool ?? true; set => _newBool = value; }

关于c# - EF Core 5 HasDefaultValue 问题,当值设置为 .Net 类型默认值时,ef 推送默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69769871/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com