我以前使用DateTimeKindEntityMaterializerSource(Git)在读取实体时将所有DateTime转换为UTC,因为默认是未指定的.
使用EF核心2.1,DateTimeKindEntityMaterializerSource不再有效,但我们实际上可以这样做
builder
.Entity<ESDataQuotation>()
.Property(e => e.CreatedDate)
.HasConversion(v => v, v => DateTime.SpecifyKind(v, DateTimeKind.Utc));
Run Code Online (Sandbox Code Playgroud)
但是,我有许多DateTime的属性,我想如果有一种方法可以为DateTime类型的所有属性进行转换.
在我的EF核心项目中,我有一些从基类DBEntity继承的实体:
public abstract class DBEntity
{
public int Id { get; set; }
public DateTime CreatedOn { get; set; }
public DateTime UpdatedOn { get; set; }
public EntityStatus EntityStatus { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想为从DBEntity继承的每个实体设置一些具有默认值的特定属性.目前我正在使用此代码:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var entities = modelBuilder.Model
.GetEntityTypes()
.Where(w => w.ClrType.IsSubclassOf(typeof(DBEntity)))
.Select(p => modelBuilder.Entity(p.ClrType));
foreach (var entity in entities)
{
entity
.Property("CreatedOn")
.HasDefaultValueSql("GETDATE()");
entity
.Property("UpdatedOn")
.HasComputedColumnSql("GETDATE()");
entity
.Property("EntityStatus")
.HasDefaultValue(EntityStatus.Created);
}
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我不想使用字符串常量指定属性名称(对于重构等不好).
有没有办法循环从DBEntity继承的实体并使用属性表达式配置默认值,如下所示:
foreach (var entity in entities)
{
entity
.Property(k …Run Code Online (Sandbox Code Playgroud) 不幸的是,ef core不支持TPC模式,但我们需要这种行为.我写了一个名为IBase的接口,每个实体都实现了这个接口:
public interface IBase
{
Guid Id { get; set; }
[Column(TypeName = "datetime2")]
DateTime CreateDate { get; set; }
[Required]
[StringLength(255)]
string CreateUser { get; set; }
bool Deleted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想摆脱Annotations来改为使用Fluent API配置.但我有大约20个不同的实体和7个Base-Values,我不想一遍又一遍地做出相同的配置:
modelBuilder.Entity<SomeEntity>()
.Property(e => e.CreateDate)
.HasColumnType("datetime2(2)")
.IsRequired();
Run Code Online (Sandbox Code Playgroud)
任何想法如何为所有实施IBase的实体配置一次Base-Property?
c# entity-framework entity-framework-core ef-fluent-api .net-core