Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq CF实体类中的EF CodeFirst计算字段_Linq_Entity Framework_Ef Code First - Fatal编程技术网

Linq CF实体类中的EF CodeFirst计算字段

Linq CF实体类中的EF CodeFirst计算字段,linq,entity-framework,ef-code-first,Linq,Entity Framework,Ef Code First,我已将计算字段(Active和CreditsLeft)直接添加到我的CodeFirst实体类中。在CF实体类中添加计算字段逻辑好吗 public class User : Entity { public User() { Id = Helper.GetRandomInt(9); DateStamp = DateTime.UtcNow; TimeZone = TimeZoneInfo.

我已将计算字段(
Active
CreditsLeft
)直接添加到我的CodeFirst实体类中。在CF实体类中添加计算字段逻辑好吗

 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);
            }
        }

    }
公共类用户:实体
{
公共用户()
{
Id=Helper.GetRandomInt(9);
DateStamp=DateTime.UtcNow;
时区=TimeZoneInfo.Utc.Id;
}
[数据库生成(DatabaseGeneratedOption.None)]
公共int Id{get;set;}
[必需]
[MaxLength(50)]
公共字符串电子邮件{get;set;}
[必需]
[MaxLength(50)]
公共字符串密码{get;set;}
[MaxLength(50)]
公共字符串名{get;set;}
[MaxLength(50)]
公共字符串LastName{get;set;}
[必需]
公共日期时间日期戳{get;set;}
公共虚拟ICollection订单{get;set;}
公共虚拟ICollection统计信息{get;set;}
公共虚拟ICollection通知{get;set;}
[数据库生成(DatabaseGeneratedOption.Computed)]
公共图书馆
{
得到
{
返回订单。任何(c=>c.Active&(c.TransactionType==TransactionType.Order | | c.TransactionType==TransactionType.Subscription));
}
}
[数据库生成(DatabaseGeneratedOption.Computed)]
公共国际信贷银行
{
得到
{
退货订单.Sum(p=>p.Credits!=null?p.Credits.Value:0);
}
}
}
在CF实体类中添加计算字段逻辑好吗

 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);
            }
        }

    }
当然,你可以这样做,但有几件事你必须注意

首先,由业务逻辑计算的属性的属性不是
[DatabaseGenerated(DatabaseGeneratedOption.computed)]
,因为这表示该值是在数据库中计算的(如在计算列中)。您应该通过
[NotMapped]
属性来标记属性。这告诉实体框架忽略数据库映射中的属性

其次,由于这两个属性都使用
订单
,因此必须确保在访问任一属性时加载订单或可以延迟加载订单。因此,您可能希望使用
Include
语句(
Include(User=>User.Orders)
)加载
User
s。否则,您必须确保在访问
Active
CreditsLeft
时上下文仍处于活动状态

第三,您不能在EF LINQ查询中直接寻址属性,如中所示

db.Users.Select(u => u.Active);
因为EF将抛出一个它不知道处于活动状态的异常。只能在内存中的物化用户对象上寻址属性