【问题标题】:EF CodeFirst computed field in CF entity classCF实体类中的EF Code First计算字段
【发布时间】:2014-01-15 09:48:11
【问题描述】:

我已将计算字段(ActiveCreditsLeft)直接添加到我的 CodeFirst 实体类中。在 CF Entity 类中添加计算字段逻辑是个好主意吗?

 public class User : Entity
    {
        public User()
        {
            Id = Helper.GetRandomInt(9);
            DateStamp = DateTime.UtcNow;
            TimeZone = TimeZoneInfo.Utc.Id;
        }

        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int Id { get; set; }               
        [Required]
        [MaxLength(50)]
        public string Email { get; set; }
        [Required]
        [MaxLength(50)]
        public string Password { get; set; }
        [MaxLength(50)]
        public string FirstName { get; set; }
        [MaxLength(50)]
        public string LastName { get; set; }
        [Required]
        public DateTime DateStamp { get; set; }        

        public virtual ICollection<Order> Orders { get; set; }
        public virtual ICollection<Statistic> Statistics { get; set; }
        public virtual ICollection<Notification> Notifications { get; set; }


        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public bool Active
        {
            get
            {
                return Orders.Any(c => c.Active && (c.TransactionType == TransactionType.Order || c.TransactionType == TransactionType.Subscription));
            }
        }

        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public int CreditsLeft
        {
            get
            {
                return Orders.Sum(p => p.Credits != null ? p.Credits.Value : 0);
            }
        }

    }

【问题讨论】:

    标签: linq entity-framework ef-code-first


    【解决方案1】:

    在 CF Entity 类中添加计算字段逻辑是个好主意吗?

    当然,您可以这样做,但您必须注意一些事项。

    首先,由业务逻辑计算的属性的属性不是[DatabaseGenerated(DatabaseGeneratedOption.Computed)],因为这表明该值是在数据库中计算的(就像在计算列中一样)。您应该用[NotMapped] 属性标记该属性。这告诉 Entity Framework 忽略数据库映射中的属性。

    其次,由于两个属性都使用Orders,因此您必须确保在访问任一属性时订单已加载或可以延迟加载。因此,您可能希望使用 Include 语句 (Include(user =&gt; user.Orders)) 加载 Users。否则,您必须确保在访问 ActiveCreditsLeft 时上下文仍然存在。

    第三,您不能直接在 EF LINQ 查询中处理属性,如

    db.Users.Select(u => u.Active);
    

    因为 EF 会抛出它不知道的异常 Active。您只能处理内存中具体化用户对象的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-13
      • 2012-11-27
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      相关资源
      最近更新 更多