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

Entity framework 在插入数据库之前,在何处设置实体的CreatedOn属性,entity-framework,repository,Entity Framework,Repository,假设我有一个实体,如下所示: 餐厅 Id:int 名称:string CreatedOn:datetime(将其添加到数据库时) 我有一个餐厅服务和餐厅职位课程。这两个类都有一个AddRestaurant方法。RestaurantService类对实体执行一些工作,然后将实体传递到存储库以进行持久化 这两个类中的哪一个应该负责设置CreatedOn属性 存储库应该负责设置CreatedOn属性,还是应该将其作为服务类职责的一部分?我个人会将其放在尽可能靠近数据库的位置,包括数据库中,如果这符

假设我有一个实体,如下所示:

餐厅

  • Id:int
  • 名称:string
  • CreatedOn:datetime(将其添加到数据库时)
我有一个餐厅服务餐厅职位课程。这两个类都有一个AddRestaurant方法。RestaurantService类对实体执行一些工作,然后将实体传递到存储库以进行持久化

这两个类中的哪一个应该负责设置CreatedOn属性


存储库应该负责设置CreatedOn属性,还是应该将其作为服务类职责的一部分?

我个人会将其放在尽可能靠近数据库的位置,包括数据库中,如果这符合您的需要的话。否则,尽管最接近实际持久化点的位置,因为这首先是
CreatedOn
的意思。

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

您可以在实体中配置它,而无需接触数据库。例如在实体框架7中(根据RC1的最新版本)

假设我有一个实体

public class Review
{
    public int ReviewId { get; set; }
    public DateTime CreatedOn { get; set; }
}
然后在我的上下文类中,在创建模型时,我实例化了映射(我可以在那里进行映射,但我喜欢将其分开)


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

我一直有点害怕将CreatedOn列的责任委托给数据库。如果数据库与应用服务器位于不同的时区,该怎么办?这可能是用户可以看到的一个字段,并且会发现刚刚创建的某些内容在X小时之前就消失了,这很奇怪。在时区很重要的情况下,通常使用UTC。但那很好;有不同的原因说明为什么不希望让DB这样做。在这种情况下,我会尽可能接近插入记录的代码。
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..
    }
}
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);
    }
}