EntityFramework Code First FluentAPI在EF6.X中的DefaultValue

33
我该如何使用EntityFramework Code First FluentAPI设置布尔属性的默认值? 类似这样:
Property(l => l.PropertyFlag).HasColumnType("bit").DefaultValue(1);

应该有某种解决方案来解决这个问题,而不仅仅是简单的“不行”。我在谈论所有可能的解决方案。 - Tony Bao
1
抱歉,我没有意识到。我以为你在寻找如何使用EntityFramework Code First FluentAPI为bool属性设置默认值。我真是太傻了;-) - Colin
4个回答

31

好消息,Code First 现在支持此功能。在生成的迁移的 "Up()" 方法中,使用以下语法指定默认值:

AddColumn("[table name]", "[column name]", c => c.Boolean(nullable: false, defaultValue: false));

"AddColumn" 方法的 MSDN


1
@joelmdev 添加了一个链接到 MSDN 文档 - htxryan
2
这只是一个向上迁移。 OP正在询问如何在插入时设置默认值。 在幕后,EF将POCO中的每个属性映射到插入语句中,如果C#属性为null,则映射为NULL。 对于值类型,它会插入值类型的默认值。 虽然很有用的信息! - John Zabroski
3
缺点是,如果您重新生成迁移,就必须记得重新添加这段代码。希望Fluent Api很快会支持此功能。 - FatAlbert

10

2
好的建议,但对于用于CreatedOn字段的DateTime.Now无效,因为在构造类实例到插入时会有时钟漂移。这将导致一些基于审计日志的难以调试的代码。 - John Zabroski
这个功能现在正在为EF7开发,并且可以在预发布版本中使用。https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/2929682-support-database-default-values-in-code-first - James Reategui
这仅适用于使用此方式添加的条目。如果您有现有的条目,并且要向模式添加列,则此方法无法使用。 - Warrick

2

另一个选择是使用自己的类来覆盖默认的SqlServerMigrationSqlGenerator类。您可以在Generate方法中注入某些要发生的事情(例如默认值)。优点是,您还可以在其他应用程序中使用它,因为它非常通用。 这里有一份详细的说明。

 internal class CustomSqlServerMigrationSqlGenerator : SqlServerMigrationSqlGenerator
{

    protected override void Generate(AddColumnOperation addColumnOperation)
    {
        SetCreatedUtcColumn(addColumnOperation.Column);

        base.Generate(addColumnOperation);
    }

    protected override void Generate(CreateTableOperation createTableOperation)
    {
        SetCreatedUtcColumn(createTableOperation.Columns);

        base.Generate(createTableOperation);
    }


    private static void SetCreatedUtcColumn(IEnumerable<ColumnModel> columns)
    {
        foreach (var columnModel in columns)
        {
            SetCreatedUtcColumn(columnModel);
        }
    }

    private static void SetCreatedUtcColumn(PropertyModel column)
    {
        if (column.Name == "CreatedUtc")
        {
            column.DefaultValueSql = "GETUTCDATE()";
        }
    }


}

完整解释:https://andy.mehalick.com/2014/02/06/ef6-adding-a-created-datetime-column-automatically-with-code-first-migrations/请仅返回翻译后的文本。 - jwatts1980

0

由于EF没有我需要的功能,例如默认值和唯一键作为外键,我们必须将ORM从EF更改为NHibernate。在我看来,NHibernate比EF 6.X拥有更多的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接