【问题标题】:How to deal with "computed" property in Entity Framework 4.1?如何处理实体框架 4.1 中的“计算”属性?
【发布时间】:2011-10-16 08:45:59
【问题描述】:

我有一个模型如下:

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。

处理“Value”的“computed”属性的正确便捷方式是什么?

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

但是“DatabaseGeneratedAttribute”在这里似乎没有用。

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案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;
             }
         }
        

        【讨论】:

        • 该值不能在 Linq to Entity 中使用:例如 var q = db.Posts.Where(p => p.Value > 100)。而且,性能也不好。每次都会计算该值。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-14
        相关资源
        最近更新 更多