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(将其添加到数据库时)
存储库应该负责设置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);
}
}