如何在ASP.NET Boilerplate中插入具有适当值的记录?

时间:2017-10-05 12:11:15

标签: aspnetboilerplate

我的列DEFAULT ((1))bit,数据类型为FlgStdTest。 我尝试将true作为falsetrue插入记录,但其值始终作为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]);

2 个答案:

答案 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; }
}