如何处理Entity Framework 4.1中的“计算”属性?

时间:2011-07-30 01:15:57

标签: entity-framework linq-to-sql linq-to-entities entity-framework-4.1

我有一个模型如下:

public class Post
{
    public int Id {get;set;}
    public virtual ICollection<Comment> Comments {get;set;} 
    public virtual ICollection<Reader> Readers {get;set;}
    public int Value {get;set;}
}

规则是Value = Comments.Count * 2 + Readers.Count。

处理“价值”的“计算”属性的正确方便是什么?

我认为最好在评论或读者添加/删除元素时自动计算和保存“价值”。

但是“DatabaseGeneratedAttribute”似乎没用。

谢谢!

3 个答案:

答案 0 :(得分:3)

我认为您的列值基于两个映射属性。使用 NotMappedAttribute 从数据库架构中排除属性并在运行时加载值。

public class Post
{
     public int Id {get;set;}
     public virtual ICollection<Comment> Comments {get;set;} 
     public virtual ICollection<Reader> Readers {get;set;}

     [NotMapped]
     public int Value 
     {   
       get return Comments.Count * 2 + Readers.Count;
     }
 }

答案 1 :(得分:3)

不支持此功能。如果linq-to-entities查询未映射到数据库列,则无法使Value可用。如果EF使用EDMX进行映射,有时可以通过使用自定义映射SQL函数或model defined function来解决,但代码优先映射不支持任何内容。其他方法是创建数据库视图并将您的实体映射到视图,但在这种情况下,实体将是只读的。

一旦使用.NET代码定义值,它始终只是根据从数据库加载的数据计算的客户端属性。如果您不希望每次需要可观察集合时重新计算属性,并且每次集合更改时事件处理程序都会更改预计算值。

DatabaseGenerated属性只是将您的属性标记为由数据库生成 - 在这种情况下,您无法更改其值,数据库必须确保将正确的值存储在您的表中。

答案 2 :(得分:0)

您可以使用DatabaseGenerated属性,然后在数据库中创建触发器以计算Value。您可以在迁移或db seed方法中创建触发器。