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将抛出一个它不知道处于活动状态的异常。只能在内存中的物化用户对象上寻址属性