我的列DEFAULT ((1))
为bit
,数据类型为FlgStdTest
。
我尝试将true
作为false
或true
插入记录,但其值始终作为public async Task<int> CreateTest(TestDetailsDTO input)
{
int testId = await InsertAndGetIdAsync(ObjectMapper.Map<TestMaster>(input));
return testId;
}
[AutoMap(typeof(TestMaster))]
public class TestDetailsDTO : FullAuditedEntityDto
{
public string Test { get; set; }
public string TestDesc { get; set; }
public bool FlgStdTest { get; set; }
public bool FlgActive { get; set; }
}
[Table("TestMaster")]
public class TestMaster: FullAuditedEntity
{
public const int NVarcharLength20 = 20;
public const int NVarcharLength50 = 50;
[Required]
[MaxLength(NVarcharLength20)]
public virtual string Test { get; set; }
[Required]
[MaxLength(NVarcharLength50)]
public virtual string TestDesc { get; set; }
[Required]
public virtual bool FlgStdTest { get; set; }
[Required]
public virtual bool FlgActive { get; set; }
}
modelBuilder.Entity<TestMaster>(b =>
{
b.HasIndex(e => new { e.Test, e.IsDeleted }).IsUnique();
b.Property(e => e.FlgActive).HasDefaultValue(true);
b.Property(e => e.FlgStdTest).HasDefaultValue(true);
});
插入。
{
"testType": "abc",
"testDesc": "xyz",
"flgStdtest": false,
"flgActive": false,
"isDeleted": false,
"deleterUserId": 0,
"deletionTime": "2017-10-05T10:50:13.956Z",
"lastModificationTime": "2017-10-05T10:50:13.956Z",
"lastModifierUserId": 0,
"creationTime": "2017-10-05T10:50:13.956Z",
"creatorUserId": 0,
"id": 0
}
请求:
System.out.println("Value #" + i+1 + " = " + x[i]);
答案 0 :(得分:1)
生成迁移时,应该会出现如下警告:
&#39; bool&#39;物业&#39; FlgStdTest&#39;在实体类型&#39; TestMaster&#39;配置了数据库生成的默认值。当属性值为&#39; false&#39;时,将始终使用此默认值,因为这是&#39; bool&#39;的CLR默认值。类型。考虑使用可空的“bool”&#39;改为输入,以便仅在属性值为&#39; null&#39;。
时才使用默认值
如果您想在迁移数据库时设置在现有行中使用的默认值,但不希望EF对任何新插入的行使用默认值,则可以执行以下操作:
modelBuilder.Entity<TestMaster>(b =>
{
b.HasIndex(e => new { e.Test, e.IsDeleted }).IsUnique();
b.Property(e => e.FlgActive)
.HasDefaultValue(true)
.ValueGeneratedNever();
b.Property(e => e.FlgStdTest)
.HasDefaultValue(true)
.ValueGeneratedNever();
});
参考:https://github.com/aspnet/EntityFrameworkCore/issues/9291
<强>更新强>
如果我未在请求中传递FlgActive和FlgStdTest,则会为这两列插入false,但默认情况下列为true。
使用自动属性初始值设定项:
public class TestDetailsDTO : FullAuditedEntityDto
{
public bool FlgStdTest { get; set; } = true;
public bool FlgActive { get; set; } = true;
}
public class TestMaster: FullAuditedEntity
{
public virtual bool FlgStdTest { get; set; } = true;
public virtual bool FlgActive { get; set; } = true;
}
答案 1 :(得分:0)
感谢Aaron的建议,这确实有帮助。请仔细阅读以下段落。
实体类型'TestMaster'上的'bool'属性'FlgStdTest'是 配置了数据库生成的默认值。此默认值始终为 当属性值为'false'时使用,因为这是CLR 'bool'类型的默认值。考虑使用可空的'bool?'类型 相反,以便默认情况下仅在属性值时使用 是'null'。
我找到了解决问题的简单解决方法,只需将bool
成员声明为nullable
即可。
[AutoMap(typeof(TestMaster))]
public class TestDetailsDTO : FullAuditedEntityDto
{
public string Test { get; set; }
public string TestDesc { get; set; }
public bool? FlgStdTest { get; set; }
public bool? FlgActive { get; set; }
}
[Table("TestMaster")]
public class TestMaster: FullAuditedEntity
{
public const int NVarcharLength20 = 20;
public const int NVarcharLength50 = 50;
[Required]
[MaxLength(NVarcharLength20)]
public virtual string Test { get; set; }
[Required]
[MaxLength(NVarcharLength50)]
public virtual string TestDesc { get; set; }
[Required]
public virtual bool? FlgStdTest { get; set; }
[Required]
public virtual bool? FlgActive { get; set; }
}