EF 6.X 中的实体框架代码优先 Fluent API 默认值

Posted

技术标签:

【中文标题】EF 6.X 中的实体框架代码优先 Fluent API 默认值【英文标题】:EntityFramework Code First FluentAPI DefaultValue in EF6.X 【发布时间】:2013-12-10 13:14:16 【问题描述】:

如何使用 EntityFramework Code First FluentAPI 为 bool 属性设置默认值?

类似:

Property(l => l.PropertyFlag).HasColumnType("bit").DefaultValue(1);

【问题讨论】:

How can set a default value constraint with Entity Framework 6 Code First? 的可能重复项 这个问题应该有某种解决方案,而不仅仅是简单的“否”。我说的是所有可能的解决方案。 对不起,我没有意识到这一点。我以为您正在寻找如何使用 EntityFramework Code First FluentAPI 为 bool 属性设置默认值。我多么愚蠢;-) 【参考方案1】:

好消息,code first 现在支持这一点。在生成的迁移的“Up()”方法中,使用以下语法指定默认值:

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

MSDN for "AddColumn" method

【讨论】:

@joelmdev 添加了指向 MSDN 文档的链接 这只是一次向上迁移。 OP 询问如何在插入时设置默认值。在幕后,如果 C# 属性为 null,则 EF 将 POCO 中的每个属性作为 NULL 映射到 Insert 语句中。对于值类型,它会插入值类型的默认值。不过有用的信息! 不利的一面是,如果您重新构建迁移,您必须记住重新添加这段代码。希望他们能尽快在 Fluent Api 中支持此功能。【参考方案2】:

我不确定一种流畅的方式,但您可以简单地在无参数构造函数中设置属性...

public class MyTable

    public MyTable()
    
        CanSetDefault = true;
    

    public bool CanSetDefault get; set; 

更新

一个快速的谷歌建议使用流利的 api 是不可能的...http://social.msdn.microsoft.com/Forums/en-US/ad854e28-02f5-451b-9000-c8bcb1355d0b/codefirst-ctp5-and-default-values?forum=adonetefx

【讨论】:

好建议,但不适用于用于 CreatedOn 字段的 DateTime.Now,因为从构造类实例到插入它时,您会有时钟漂移。这会导致一些基于审计日志难以调试的代码。 目前正在为 EF7 开发此功能,并在预发布版中提供 data.uservoice.com/forums/… 这仅适用于使用此添加的条目。如果您有现有条目,并且要向架构中添加一列,则此方法不起作用。【参考方案3】:

这里的另一个选项是用您自己的覆盖默认的 SqlServerMigrationSqlGenerator 类。然后,您可以在 Generate 方法中注入您希望发生的某些事情(例如,默认值)。这样做的好处是您也可以在其他应用程序中使用它,因为它非常通用。 Here 是一个很好的解释。

 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()";
        
    



【讨论】:

完整解释:andy.mehalick.com/2014/02/06/…【参考方案4】:

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

【讨论】:

以上是关于EF 6.X 中的实体框架代码优先 Fluent API 默认值的主要内容,如果未能解决你的问题,请参考以下文章

一对一或零对一实体框架代码优先 Fluent Api

PHP中的代码优先实体框架模型

实体框架+多级继承+EF代码优先

用于一对零或一关系的实体框架 (EF) 代码优先级联删除

实体框架代码优先的性能

实体框架代码优先开发资源和文档