【问题标题】:Entity Framework Core get entity column nameEntity Framework Core 获取实体列名
【发布时间】: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


【解决方案1】:

在上下文类中是这样的:

 public override int SaveChanges()
        {

            foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty(entry.Entity.ToString().Substring(entry.Entity.ToString().Length - 12) + "_DT_CAD") != null))
            {
                if (entry.State == EntityState.Added)
                {
                    entry.Property(entry.Entity.ToString().Substring(entry.Entity.ToString().Length - 12) + "_DT_CAD").CurrentValue = DateTime.Now;
                }

                if (entry.State == EntityState.Modified)
                {
                    entry.Property(entry.Entity.ToString().Substring(entry.Entity.ToString().Length - 12) + "_DT_CAD").IsModified = false;
                }
            }
   }

【讨论】:

    猜你喜欢
    • 2017-06-13
    • 1970-01-01
    • 2019-06-08
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2021-12-03
    • 2018-02-27
    相关资源
    最近更新 更多