【问题标题】:How access to Storage-Property in c#?如何在 c# 中访问 Storage-Property?
【发布时间】:2016-05-28 03:49:58
【问题描述】:

我将一些访问表映射到类。我创建了属性并将它们绑定到列。我使用了如下的存储属性

string _ColValue;
[Column(Storage = "_ColValue")]
public string ColValue
{
    get { return _ColValue; }
    set { _ColValue = value; }
}

这些列包含字符串值,但它们的末尾有很多空格。它们总是以恒定的长度出现。现在我想修剪值以删除空格。我认为在从数据表映射到我的属性时直接操作字符串会很好。

我的意图是在构造函数中调用的方法中迭代映射属性的所有私有字段。

void TrimPropValues()
{
    FieldInfo[] fi = this.GetType().GetFields(BindingFlags.NonPublic
                                                 | BindingFlags.Instance);

    foreach (FieldInfo fiItem in fi)
    {               
        if (fiItem.FieldType.Equals(typeof(string))
            && fiItem.GetValue(this) != null)
        {
            fiItem.SetValue(this, fiItem.GetValue(this).ToString().TrimEnd(' '));
        }
    }
}

当我在构造函数中调用方法时,字段未填充。映射似乎稍后发生。什么是调用该方法的正确时机?映射何时发生,或者更确切地说,我如何才能到达映射的时刻?

【问题讨论】:

  • 在构造函数中调用这个函数肯定为时过早,而且它发生在某个内部点。通常,更好的方法是在更新到数据库之前修剪值,或者可能加载 UI...
  • 我没有更新,它只是一个读取数据库连接
  • 那么您必须在查询发生后的某个时间手动调用该过程;您可以采取的另一种方法是更新 EF 使用的 T4 模板,并在设置器中为字符串属性修剪文本......不容易,但可行。
  • 你的第一个建议不是特别聪明,但我现在这样做了;-)。恕我直言,该类本身应该实现这一点。
  • 您的第二个建议似乎不错,但我没有支持模板和大量代码生成的 IDE。所以对我来说可能(太多)编码。这只是一个小应用程序;这是不值得的。我希望有一个更简单的方法

标签: c# entity-framework mapping


【解决方案1】:

您可以将其很好地封装在上下文子类本身中:

public class MyContext : DbContext
{
    public MyContext()
        : base()
    {
        ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += (sender, e) =>
        {
            TrimStringValues(Entry(e.Entity));
        };
    }

    void TrimStringValues(DbEntityEntry entry)
    {
        foreach (var property in entry.CurrentValues.PropertyNames)
        {
            var currentValue = entry.CurrentValues[property] as string;
            if (currentValue != null)
                entry.CurrentValues[property] = currentValue.Trim();
        }
    }
}

在上下文的构造函数中,订阅了底层ObjectContextObjectMaterialized 事件。在事件处理程序中,每个物化实体都受制于TrimStringValues 方法。在这种方法中,EF 自己的基础结构用于修剪字符串值。这比通过反射做同样的事情要快。

【讨论】:

  • 非常感谢。这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 2019-12-31
  • 2020-04-20
  • 2018-09-27
相关资源
最近更新 更多