代码之家  ›  专栏  ›  技术社区  ›  GendoIkari

EF Core可以映射一个GET(计算)属性吗?

  •  1
  • GendoIkari  · 技术社区  · 4 年前

    我有一个模型类,它有一个我想存储在数据库中的对象数组。为了将这些数据整合到一行和一列中;我有一个 get 属性,该属性连接数组并返回单个字符串。我想在数据库中存储这个连接的字符串。

    [NotMapped]
    public object[] Values { get; set; }
    
    public string Value
    {
        get
        {
            return string.Join("|", this.Values);
        }
    }
    

    我已经确认Value属性包含我期望的字符串。但是,这不会保存到数据库中;它只是将其保存为NULL。我没有任何特殊的映射代码;它依赖于列名与属性名匹配的默认设置。

    我找到的最接近的东西 this tutorial 它描述了使用HasField()方法将列映射到私有字段而不是属性;但在我的情况下,这不仅仅是因为我有一套私人设备;我没有任何集合属性。

    1 回复  |  直到 4 年前
        1
  •  1
  •   Adolfo F. Ibarra Landeo    4 年前

    你为什么不这样做呢?

    private object[] values;
    
    [NotMapped]
    public object[] Values { 
        get => values;
        set {
            if (value != values);
            values = value;
            Value = string.Join("|", value);
        }
    }
    
    public string Value { get; set; }
    
        2
  •  1
  •   Claudio Valerio    4 年前

    你可以这样做来欺骗EF:

    [NotMapped]
    public object[] Values { get; set; }
    
    public string Value
    {
        get
        {
            return string.Join("|", this.Values);
        }
        set {}
    }
    

    塞特什么都不会做,所以你实现了你想要的。

        3
  •  1
  •   Fabio    4 年前

    另一种不混合业务和持久性结构的方法。

    应用程序的其他部分应该关心/了解数据的存储方式。

    public class BusinessObject
    {
        public object[] Values { get; set; }
    }
    
    public class ValuesEntity
    {
        public static ValuesEntity From(BusinessObject object)
        {
            return new ValuesEntity { Values = string.Join("|", object.Values) };
        }
    
        public string Values { set; set; }
    
        public BusinessObject ToBusinessObject()
        {
            return new BusinessObject { Values = Values.Split("|") };
        }
    }
    

    使用这种方法,您将明确地“告诉”代码的其他开发人员或读者您的意图。
    为每个职责(业务逻辑或持久性)使用不同的类会更简单,因为这两个职责是相互隔离的。