代码之家  ›  专栏  ›  技术社区  ›  Chris B. Behrens

实体框架中的计算属性

  •  29
  • Chris B. Behrens  · 技术社区  · 15 年前

    假设我有一个具有以下属性的Employee对象:

    string Name { get; }
    float Hours { get; }
    float Wage { get; }
    

    我想加一个财产,工资,等于小时*工资。在一个普通的业务对象中,我只需要在属性中编写代码,但如果需要重新生成类,这可能会被清除。

    有没有一个EF标准的方法来实现这一点而不需要麻烦地将其映射到数据库实体?

    5 回复  |  直到 9 年前
        1
  •  51
  •   abatishchev Marc Gravell    12 年前

    的确。例如,创建一个单独的文件, 员工扩展.cs .

    在此文件中,放置以下代码:

    public partial class Employee
    {
        public decimal Salary
        {
            get { return Hours * Wage; }
        }
    }
    

    LINQ to SQL和实体框架类是用 部分的 关键字,允许您将定义拆分为多个文件,因为设计器知道您将要向类中添加成员,这些成员不会被不断自动生成的基源文件覆盖。

        2
  •  7
  •   Argo    15 年前

    如果我没记错的话,ef创建的类是部分的。因此,您可以添加另一个文件,其中包含另一个部分类(当然是同一个名称空间,同一个类名),而不是实现该属性

    public single Salary
    {
       get
       {
           return this.Hours * this.Wage;
       }
    }
    

    应该这样做(如果那些单曲不能为空,请注意!)

        3
  •  6
  •   Amit Philip.ie    12 年前

    我一开始没能得到阿戈的答复。在玩了一会儿之后,我注意到如果我装饰了属性(如wcf),它的以下属性,所有工作都很好。

    [global::System.Runtime.Serialization.DataMemberAttribute()]
    

    根据“argo”的说明,创建一个单独的文件(例如employeeextension.cs)。如前所述,应将其标记为“部分”。

    在此文件中,放置以下代码:

    public partial class Employee 
    {
       [global::System.Runtime.Serialization.DataMemberAttribute()]       
       public decimal Salary     
       { 
          get { return Hours*Wage; } 
       } 
    }  
    

    希望这有帮助。

        4
  •  5
  •   Martin Liversage    12 年前

    可以在实体类中实现该属性。实体框架将生成部分类,允许您向类中添加成员。在代码中添加这样的类:

    public partial class Employee {
      public Single Salary {
        get { return Hours*Wage; }
      }
    }
    
        5
  •  2
  •   Elijah W. Gagne    12 年前

    这对我来说不适用于实体框架5。我的解决方案是简单地使用[NotMapped]属性。有关详细信息,请参阅 Code First DataAnnotations