EF 4.1 - 如何在datetime列的插入时添加默认值

时间:2011-06-04 15:29:27

标签: entity-framework entity-framework-4.1

使用EF 4.1如何向基础表添加默认值?在这种特殊情况下,如何在每次向数据库插入新记录时将datetime列设置为等效的getdate,而不必在代码中设置它。

提前致谢

6 个答案:

答案 0 :(得分:7)

@elkdanger提出的解决方案是可行的,但只要您使用代码优先方法,您就不必创建分部类 - 您可以将初始化直接放置到您的实体。

不要使用数据库方法!它不起作用,因为它会要求标记属性作为数据库生成(插入后正确重新填充)。标记属性数据库后,您永远不能在应用程序中更改其值。

最后一个选项会覆盖派生SaveChanges中的DbContext并手动设置属性。类似的东西:

public override int SaveChanges()
{
    var entities = ChangeTracker.Entries<YourEntityType>()
                                .Where(e => e.State == EntityState.Added)
                                .Select(e => e.Entity);
    var currentDate = DateTime.Now;
    foreach(var entity in entities)
    {
        entity.Date = currentDate;
    }

    return base.SaveChanges();
}

如果在创建实体实例和保存实例之间存在显着差异,这种方法会更好。

答案 1 :(得分:2)

您可以为实体创建一个分部类,并在构造函数中将date列设置为DateTime.Now。这样,每次创建类的实例时,该字段都将“自动”设置为当前日期。

答案 2 :(得分:0)

您可以(也许应该)使用触发器或默认值在表中自行完成。

答案 3 :(得分:0)

实体框架本身没有它的机制。您必须在数据库或代码中手动执行此操作。

答案 4 :(得分:0)

您还可以修改T4模板(.tt文件)以添加从生成的构造函数中调用的部分方法。然后,您可以创建自己的分部类并实现部分方法并设置默认值。

创建构造函数的T4模板的片段,后跟partial方法。请注意最后三行:

public <#=code.Escape(entity)#>()
{
<#
    foreach (var edmProperty in propertiesWithDefaultValues)
    {
#>
    this.<#=code.Escape(edmProperty)#> = =code.CreateLiteral(edmProperty.DefaultValue)#>;
<#
    }

    foreach (var navigationProperty in collectionNavigationProperties)
    {
#>
    this.<#=code.Escape(navigationProperty)#> = new HashSet<<#=code.Escape(navigationProperty.ToEndMember.GetEntityType())#>>();
<#
    }

    foreach (var complexProperty in complexProperties)
    {
#>
    this.<#=code.Escape(complexProperty)#> = new <#=code.Escape(complexProperty.TypeUsage)#>();
<#
    }
#>

    SetDefaultValues();
}

partial void SetDefaultValues();

这将导致生成的实体具有以下内容:

public Foo()
{
    // Properties set based on defaults in edmx

    SetDefaultValues();
}

partial void SetDefaultValues();

然后,在您的部分课程中,您只需添加以下内容:

partial void SetDefaultValues()
{
    this.SomeDate = DateTime.Today;
}

答案 5 :(得分:0)

使用[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 来自System.ComponentModel.DataAnnotations.Schema;

如果您在数据库上配置了默认值。