在插入数据库之前,在何处设置实体的CreatedOn属性

时间:2011-12-18 02:33:11

标签: entity-framework repository

说我有一个实体如下:

餐厅

 
     
  • Id:int
  •  
  • 名称:字符串
  •  
  • CreatedOn:datetime(当它被添加到数据库时)
  •  

我有一个 RestaurantService RestaurantRepository 类。这两个类都有一个 AddRestaurant 方法。 RestaurantService类对实体执行一些操作,然后将实体传递给存储库以保持持久性。

两个班级中哪一个应该负责设置 CreatedOn 属性?

存储库是否应该负责设置 CreatedOn 属性,还是应该成为Service类职责的一部分?

2 个答案:

答案 0 :(得分:1)

我个人会尽可能地将它放在数据库附近 - 包括实际上在数据库中,如果它满足您的需求。否则,无论哪里最接近实际持久的地方,因为这首先是CreatedOn的含义。

答案 1 :(得分:0)

由于记录最终由数据库本身保留,因此指示数据库在添加实体时生成当前日期是有意义的。

您可以在实体中配置它而不触及数据库。例如,在Entity Framework 7中(最新的RC1)

说我有一个实体

public class Review
{
    public int ReviewId { get; set; }
    public DateTime CreatedOn { get; set; }
}

然后在我的上下文类中,在模型创建时,我实例化映射(我可以在那里进行映射,但我喜欢将它保持分离)

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options ) : base(options)
    {
    }

    public DbSet<Review> Reviews { get; set; }
    //etc.

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        //Mappings
        new ReviewMap(modelBuilder.Entity<Review>());
        //etc..
    }
}

然后映射。 (请记住使用模型扩展所在的命名空间)。在下面的说明中,我告诉Entity在添加记录(实体)时生成此值,并且应用程序不需要手动设置日期时间。相反,我告诉它在添加实体时执行SQL Server函数GETUTCDATE(),所以我不再需要担心它。

using Microsoft.Data.Entity; //here is where the extensions are
public class ReviewMap
{
    public ReviewMap(EntityTypeBuilder<Review> entityBuilder)
    {
        entityBuilder.HasKey(r => r.ReviewId);

        entityBuilder.Property(r => r.CreatedOn)
            .ValueGeneratedOnAdd()
            .HasDefaultValueSql("GETUTCDATE()")
            .IsRequired(true);
    }
}

关于您对数据库时区的关注,最佳做法是始终将数据库中的日期保存为UTC(位置不可知),并根据用户位置转换日期,以便用户始终查看本地日期。这就是为什么数据库的指令是GETUTCDATE()而不是GETDATE()