说我有一个实体如下:
餐厅
我有一个 RestaurantService 和 RestaurantRepository 类。这两个类都有一个 AddRestaurant 方法。 RestaurantService类对实体执行一些操作,然后将实体传递给存储库以保持持久性。
两个班级中哪一个应该负责设置 CreatedOn 属性?
存储库是否应该负责设置 CreatedOn 属性,还是应该成为Service类职责的一部分?
答案 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()