【发布时间】:2022-01-19 11:37:39
【问题描述】:
我在动态返回表列名时遇到了一些问题。 我在 DDD 标准中创建了一个 ASP net core 3.1 项目,我使用的是 Entity Framework Core v5.0.12。
我创建的实体如下:
public class TBSISTEMAXXX
{
public Int64? SISTEMAXXX_NS { get; set; }
public string SISTEMAXXX_NM { get; set; }
public string SISTEMAXXX_DS { get; set; }
public string SISTEMAXXX_VIEW { get; set; }
public string SISTEMAXXX_CONTROLLER { get; set; }
public DateTime SISTEMAXXX_DT_CAD { get; set; }
public DateTime? SISTEMAXXX_DT_INA { get; set; }
}
我有一个RepositoryBase 类,它包含所有“通用”函数,例如插入,我通过实体查找名称为“_DT_CAD”的“列”,这将是注册日期插入时的记录。
public async Task<T> InsertAsync(T Objeto)
{
try
{
using (var data = new Context(_OptionsBuilder))
{
await data.Set<T>().AddAsync(Objeto);
foreach (var entry in data.ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty(entry.Entity.GetType().Name + "_DT_CAD") != null))
{
if (entry.State == EntityState.Added)
{
entry.Property(entry.Entity.GetType().Name + "_DT_CAD").CurrentValue = DateTime.Now;
}
}
await data.SaveChangesAsync();
data.Entry(Objeto).GetDatabaseValues();
}
}
catch (Exception)
{
throw;
}
return Objeto;
}
之前此功能在旧版本的 Entity Framework Core 中有效,但现在不再有效。
我已经研究了一些方法来解决这个问题,但如果有人成功的话,我仍然没有成功。
为了临时解决这个问题,我将代码如下:
public class TBSISTEMAXXX
{
public Int64? SISTEMAXXX_NS { get; set; }
public string SISTEMAXXX_NM { get; set; }
public string SISTEMAXXX_DS { get; set; }
public string SISTEMAXXX_VIEW { get; set; }
public string SISTEMAXXX_CONTROLLER { get; set; }
public DateTime SISTEMAXXX_DT_CAD { get; set; } = DateTime.Now;
public DateTime? SISTEMAXXX_DT_INA { get; set; }
}
但是,我在对注册表进行更改时遇到了困难,因为它总是最终填充有修改日期并丢失了插入注册表的日期。
如果有人可以帮助我,因为我希望项目保持最新的版本并能够动态获取表列的名称,因为我需要在其他函数中执行此操作。
【问题讨论】:
-
DDD 这样做的方式是不让存储库在对象上设置任何类型的属性(通常具有公共设置器不是 DDD 风格),而是有一个私有构造函数和一个公共静态创建实体时将
SISTEMAXXX_DT_CAD设置为DateTime.Now的工厂方法。这确保了实体创建的日期之后不能更改,并且还承担了存储库不应该对实体承担的责任。 -
请澄清“不工作”。即使显示的代码无法找到属性,因为您正在寻找“{Type.Name}{PropertyName}`,而您的类名是“TBSISTEMAXXX”和属性名以“SISTEMAXXX”开头(没有“TB”前缀)。因此,这在任何 EFC 版本中都不能“工作”。
-
@Nannanas 我明白,之前我在上下文类中有一个类似的方法为我执行此操作,但是当我开始使用具有较新版本的实体时它停止执行此操作。
-
@Nannanas 我把它留在下面,因为我在上下文类中使用它,但由于它是每个实体都会使用的函数,我设法做到这一点的方式是将日期设置为插入时间
标签: c# asp.net-core entity-framework-core ddd-repositories