是否有“优雅”的方式给特定的属性一个默认值?

也许是DataAnnotations,比如:

[DefaultValue("true")]
public bool Active { get; set; }

谢谢你!


当前回答

嗯…我先做DB,在这种情况下,这实际上要简单得多。EF6对吧?只需打开你的模型,右键单击你想要设置默认值的列,选择属性,你会看到一个“DefaultValue”字段。填好并保存。它将为您设置代码。

你的里程数可能会在代码上有所不同,但我没有使用过这种方法。

许多其他解决方案的问题是,虽然它们最初可能有效,但一旦您重新构建模型,它就会抛出您插入到机器生成文件中的任何自定义代码。

这个方法通过在edmx文件中添加一个额外的属性来工作:

<EntityType Name="Thingy">
  <Property Name="Iteration" Type="Int32" Nullable="false" **DefaultValue="1"** />

通过在构造函数中添加必要的代码:

public Thingy()
{
  this.Iteration = 1;

其他回答

你的模型属性不必是“自动属性”,即使那样更简单。而DefaultValue属性实际上只是提供信息的元数据 这里接受的答案是构造函数方法的一种替代方法。

public class Track
{

    private const int DEFAULT_LENGTH = 400;
    private int _length = DEFAULT_LENGTH;
    [DefaultValue(DEFAULT_LENGTH)]
    public int LengthInMeters {
        get { return _length; }
        set { _length = value; }
    }
}

vs.

public class Track
{
    public Track()
    {
        LengthInMeters = 400;   
    }

    public int LengthInMeters { get; set; }        
}

这只适用于使用这个特定类创建和消费数据的应用程序。如果数据访问代码是集中的,通常这不是问题。要跨所有应用程序更新该值,需要配置数据源以设置默认值。Devi的回答展示了如何使用迁移、sql或数据源使用的任何语言来实现这一点。

你可以手动编辑代码第一次迁移:

public override void Up()
{    
   AddColumn("dbo.Events", "Active", c => c.Boolean(nullable: false, defaultValue: true));
} 

我承认我的方法脱离了“代码优先”的概念。但是如果你有能力改变表本身的默认值…这比你上面要经历的长度要简单得多……我就是懒得做那些工作!

海报上最初的想法似乎是可行的:

[DefaultValue(true)]
public bool IsAdmin { get; set; }

我以为他们只是犯了加引号的错误…但遗憾的是,没有这样的直觉。其他建议对我来说太多了(假设我有进入表并进行更改所需的特权……并不是每个开发者在任何情况下都会这么做)。最后我还是用老办法做了。我在SQL Server表中设置了默认值…我的意思是真的,已经够了!注意:我进一步测试了添加-迁移和更新-数据库,更改卡住了。

很简单!只需要注释required即可。

[Required]
public bool MyField { get; set; }

迁移的结果将是:

migrationBuilder.AddColumn<bool>(
name: "MyField",
table: "MyTable",
nullable: false,
defaultValue: false);

如果希望为true,请在更新数据库之前在迁移中将defaultValue更改为true

在@SedatKapanoglu评论之后,我添加了我所有的方法,因为他是对的,只是使用流畅的API是行不通的。

1-创建自定义代码生成器和覆盖生成一个ColumnModel。

   public class ExtendedMigrationCodeGenerator : CSharpMigrationCodeGenerator
{

    protected override void Generate(ColumnModel column, IndentedTextWriter writer, bool emitName = false)
    {

        if (column.Annotations.Keys.Contains("Default"))
        {
            var value = Convert.ChangeType(column.Annotations["Default"].NewValue, column.ClrDefaultValue.GetType());
            column.DefaultValue = value;
        }


        base.Generate(column, writer, emitName);
    }

}

2-分配新的代码生成器:

public sealed class Configuration : DbMigrationsConfiguration<Data.Context.EfSqlDbContext>
{
    public Configuration()
    {
        CodeGenerator = new ExtendedMigrationCodeGenerator();
        AutomaticMigrationsEnabled = false;
    }
}

3-使用fluent api创建注释:

public static void Configure(DbModelBuilder builder){    
builder.Entity<Company>().Property(c => c.Status).HasColumnAnnotation("Default", 0);            
}